如何在 Haskell 中使用 let with guards?
How to use let with guards in Haskell?
我正尝试在 Haskell 中执行以下操作:
someFunction :: [] -> Int
someFunction list
let a
| length list == 1 = 10
| otherwise = 0
b
| length list == 1 = 10
| otherwise = 0
in findValues (a+b)
因此 a 和 b 的值将取决于守卫中的条件是否得到满足。这种语法一直给我错误,我不确定为什么。我是否需要使用 where 子句或是否有正确的 "let" 语法来实现我想要的?
感谢您的帮助
这有点难说,但我猜你的意思是
someFunction :: [] -> Int
someFunction list =
let a | length list == 1 = 10
| otherwise = 0
b | length list == 1 = 10
| otherwise = 0
in findValues (a+b)
这是可行的,但请记住 length list == 1
效率非常低:它会扫描所有条目并一一计数,花费 O(N) 时间与 1 进行比较。
相反,请考虑使用 case .. of
,它可以在恒定时间内检查。
someFunction :: [] -> Int
someFunction list = let
a = case list of
[_] -> 10 -- list is of the form [x] for some x
_ -> 0 -- list is of any other form
b = case list of
[_] -> 10
_ -> 0
in findValues (a+b)
甚至:
someFunction :: [] -> Int
someFunction list = let
(a,b) = case list of
[_] -> (10,10) -- list is of the form [x] for some x
_ -> (0 ,0 ) -- list is of any other form
in findValues (a+b)
(另请注意 a
和 b
具有相同的值:这是故意的,还是代码只是一个示例?)
在可能的情况下,我强烈建议避免守卫以支持模式匹配。
我正尝试在 Haskell 中执行以下操作:
someFunction :: [] -> Int
someFunction list
let a
| length list == 1 = 10
| otherwise = 0
b
| length list == 1 = 10
| otherwise = 0
in findValues (a+b)
因此 a 和 b 的值将取决于守卫中的条件是否得到满足。这种语法一直给我错误,我不确定为什么。我是否需要使用 where 子句或是否有正确的 "let" 语法来实现我想要的?
感谢您的帮助
这有点难说,但我猜你的意思是
someFunction :: [] -> Int
someFunction list =
let a | length list == 1 = 10
| otherwise = 0
b | length list == 1 = 10
| otherwise = 0
in findValues (a+b)
这是可行的,但请记住 length list == 1
效率非常低:它会扫描所有条目并一一计数,花费 O(N) 时间与 1 进行比较。
相反,请考虑使用 case .. of
,它可以在恒定时间内检查。
someFunction :: [] -> Int
someFunction list = let
a = case list of
[_] -> 10 -- list is of the form [x] for some x
_ -> 0 -- list is of any other form
b = case list of
[_] -> 10
_ -> 0
in findValues (a+b)
甚至:
someFunction :: [] -> Int
someFunction list = let
(a,b) = case list of
[_] -> (10,10) -- list is of the form [x] for some x
_ -> (0 ,0 ) -- list is of any other form
in findValues (a+b)
(另请注意 a
和 b
具有相同的值:这是故意的,还是代码只是一个示例?)
在可能的情况下,我强烈建议避免守卫以支持模式匹配。