我正在尝试嵌套警卫,以检查两个以上的情况:
f :: Int -> Int
f i
| bool1
| bool2 = a
| bool3 = a2
| otherwise = a3
| bool4
| bool5 = a4
| bool6 = a5
| otherwise = a6
| bool8
...
| otherwise = an
这给了我一个解析错误。
是正确的方法
用&&或
使卫兵变扁平
实现这样的功能:
multiIf :: [Bool] -> [a] -> a
multiIf (x:xs) (l:ls) = if x then l else multiIf xs ls
multiIf _ _ = undefined
还是有另一种方法?
答案 0 :(得分:3)
不是直接的,但是the MultiWayIf extension可以为您提供非常相似的样式。
{-# LANGUAGE MultiWayIf #-}
f :: Int -> Int
f i
| bool1
= if | bool2 -> a
| bool3 -> a2
| otherwise -> a3
| bool4
= if | bool5 -> a4
| bool6 -> a5
| otherwise -> a6
| bool8
...
| otherwise = an