0

假设我有一个功能:

isOne :: Int -> Int -> Int
isOne x y =

然后 ifx == 1然后y != 1它返回1(其中一个参数等于 1),ifx == 1并且y == 1它返回2(因为两者都是 1),ifx != 1并且y != 1它返回0等等。

我不知道如何使用 if 语句(或用例)进行一次检查。

4

4 回答 4

6

为什么,您只需要将您的英语翻译成 Haskell:

if (x==1) && (y /= 1) then 1
else if (x/=1) && (y==1) then 1
...

但你真的想要:

isOne 1 1 = 2
isOne 1 _ = 1
isOne _ 1 = 1
isOne _ _ = 0

或者,甚至更短:

isOne x y = fromEnum (x==1) + fromEnum (y==1)
于 2013-02-26T23:35:46.423 回答
5

最简单的方法是使用模式匹配。您可以按案例定义一个函数,这些案例按照它们发生的顺序进行解释

isOne 1 1 = 2
isOne 1 _ = 1
isOne _ 1 = 1
isOne _ _ = 0

或者,您可以使用警卫

isOne x y | (x == 1) && (y == 1) = 2
          | (x == 1) && (y != 1) = 1
          | (x != 1) && (y == 1) = 1
          | otherwise            = 0

再次,从上到下检查这些。也就是说,如果第一个守卫匹配,则使用第一个等式,否则尝试第二个等式,依此类推。这个也可以写

isOne x y | (x == 1) && (y == 1) = 2
isOne x y | (x == 1) && (y != 1) = 1
isOne x y | (x != 1) && (y == 1) = 1
isOne x y | otherwise            = 0

或者

isOne x y | (x == 1) && (y == 1) = 2
isOne x y | (x == 1) || (y == 1) = 1
isOne x y | otherwise            = 0

另一种方法是使用if then else表达式。

isOne x y = if (x == 1) && (y == 1) 
            then 2 
            else if (x == 1) || (y == 1) then 1 else 0

或者你可以尝试做

isOne x y = (go x) + (go y) where
   go 1 = 1
   go _ = 0

或其他几十种方式中的任何一种...

于 2013-02-26T23:36:08.193 回答
4

方法一

使用配对case语句

isOne x y = case (x, y) of 
  (1, 1) -> 2
  (1, _) -> 1
  (0, 0) -> 0
  ...

方法二

使用嵌套if语句

isOne x y = if x == 1 then (if y == 1 then 2 else 1) else 0
于 2013-02-26T23:36:13.227 回答
3

case我会在函数定义中或在元组上使用直接模式匹配。

但最易读的替代方案是 IMO length [ q | q<-[x,y], q==1 ]

于 2013-02-27T00:02:06.657 回答