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语句(或使用案例)进行多次检查.
为什么,你只需要将你的英语翻译成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)
最简单的方法是使用模式匹配.您可以按案例定义函数,这些函数按它们出现的顺序进行解释
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)
或任何其他几种方式......