我是Haskell的新手。我有类似的东西
var1::Int
var1 = 1;
if var1
then // call some fumction
else // call some other function
在Haskell中执行此操作的方法是什么?我正在做的是根据变量var
的值调用不同的函数(请注意它是Int
)。 var1
只能将1
或0
作为值。请注意,我的条件不能使用bool。
答案 0 :(得分:5)
我会使用模式匹配:
case var of
0 -> callF
1 -> callOtherF
otherwise -> handleNot0or1
您甚至可以创建自己的检查器:
validate :: Int -> Bool
validate 0 = False
validate 1 = True
validate _ = whatever_you_decide
答案 1 :(得分:1)
if
的类型签名是Bool -> a -> a -> a
。这意味着您必须将布尔值作为第一个参数。在其他语言(如C或Python)中,if
语句尝试将给定的参数转换为布尔值。在Haskell中,由于类型系统不允许您将内存位置引用为其他类型,因此失败。
要做你的例子,你必须使用(>)/(<)运算符,它们可以将Ord a的实例转换为Bool。
答案 2 :(得分:1)
根据返回值,应该满足模式匹配,如此
boolSwitch 1 = 3+3
boolSwitch 0 = 3.0*2.5
boolSwitch _ = undefined
答案 3 :(得分:1)
如果你想使用if-else结构,你必须将它作为函数定义的一部分,如此
function :: Int -> ...
function i =
if i == 1
then ...
else ...
但是,我不明白为什么要使用Int
代替Bool
。如果0
和1
是您要使用的唯一整数,那么更多' haskellish'做你可能想要做的事情的方法是创建一个返回类型为Maybe a
的函数,如果不是0
或1
作为输入,并使用模式匹配:
function :: Int -> Maybe ...
function 0 = ... -- Has to return either 'Just ...' or 'Nothing'
function 1 = ... -- Same as above
function _ = Nothing
答案 4 :(得分:0)
由于已经提到模式匹配,我想提一下警卫:
myFunc a | (a == 0) = fooCall
| (a == 1) = barCall
| otherwise = etcCall
当然总有简单的if-then-else:
myFunc a = if (a == 0)
then fooCall
else if (a == 1)
then barCall
else etcCall