Haskell - 符合条件的参数计数?

0 haskell functional-programming

假设我有一个功能:

isOne :: Int -> Int -> Int
isOne x y =
Run Code Online (Sandbox Code Playgroud)

然后,如果x == 1和y != 1然后返回1(参数之一等于1),如果x == 1和y == 1它返回2(因为两者都是1),如果x != 1和y != 1它返回0等

我无法弄清楚如何使用if语句(或使用案例)进行多次检查.

Ing*_*ngo 6

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

if (x==1) && (y /= 1) then 1
else if (x/=1) && (y==1) then 1
...
Run Code Online (Sandbox Code Playgroud)

但你真的想要:

isOne 1 1 = 2
isOne 1 _ = 1
isOne _ 1 = 1
isOne _ _ = 0
Run Code Online (Sandbox Code Playgroud)

或者,甚至更短:

isOne x y = fromEnum (x==1) + fromEnum (y==1)
Run Code Online (Sandbox Code Playgroud)


Phi*_* JF 5

最简单的方法是使用模式匹配.您可以按案例定义函数,这些函数按它们出现的顺序进行解释

isOne 1 1 = 2
isOne 1 _ = 1
isOne _ 1 = 1
isOne _ _ = 0
Run Code Online (Sandbox Code Playgroud)

或者,你可以使用警卫

isOne x y | (x == 1) && (y == 1) = 2
          | (x == 1) && (y != 1) = 1
          | (x != 1) && (y == 1) = 1
          | otherwise            = 0
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

要么

isOne x y | (x == 1) && (y == 1) = 2
isOne x y | (x == 1) || (y == 1) = 1
isOne x y | otherwise            = 0
Run Code Online (Sandbox Code Playgroud)

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

isOne x y = if (x == 1) && (y == 1) 
            then 2 
            else if (x == 1) || (y == 1) then 1 else 0
Run Code Online (Sandbox Code Playgroud)

或者你可以尝试一下

isOne x y = (go x) + (go y) where
   go 1 = 1
   go _ = 0
Run Code Online (Sandbox Code Playgroud)

或任何其他几种方式......