假设我有一个功能:
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 语句(或用例)进行一次检查。
假设我有一个功能:
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 语句(或用例)进行一次检查。
为什么,您只需要将您的英语翻译成 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)
最简单的方法是使用模式匹配。您可以按案例定义一个函数,这些案例按照它们发生的顺序进行解释
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
或其他几十种方式中的任何一种...
使用配对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
case
我会在函数定义中或在元组上使用直接模式匹配。
但最易读的替代方案是 IMO length [ q | q<-[x,y], q==1 ]
。