haskell - 模式匹配与 guard 混合

标签 haskell pattern-matching

我想定义函数:

accumulate_list' :: Num a => [a] -> ( a -> a -> a ) -> a
accumulate_list' l f 
    | [] f = 0
    | (x:xs) f = f x (accumulate_list xs f)

但它没有编译,提示 x, xs, x, xs, 不在范围内。

为了达到同样的效果,我定义了这个函数
accumulate_list :: Num a => [a] -> ( a -> a -> a ) -> a
accumulate_list [] f = 0
accumulate_list (x:xs) f = f x $ accumulate_list xs f

它编译得很好,并且确实喜欢 sum如果传入参数的函数是(+),则在列表中.是的,我终于发现我想要实现的目标确实已经在 Prelude 中作为 sum 存在。功能。

但是,我不明白为什么混合防护和模式匹配的第一个版本无法编译。问题是什么 ?

最佳答案

这是因为守卫基本上是一个 bool 表达式。他们必须评估为 TrueFalse .像这样的东西应该类型检查:

accumulate_list' :: (Eq a, Num a) => [a] -> ( a -> a -> a ) -> a
accumulate_list' l f 
    | l == [] = 0
    | otherwise = undefined -- fill out undefined

还值得一提的是,自从 Haskell 2010 中添加了模式防护以来,您可以像这样混合模式和防护:
accumulate_list' :: (Eq a, Num a) => [a] -> ( a -> a -> a ) -> a
accumulate_list' l f
    | []     <- l = 0          --pattern for the empty list case
    | 10 < 5      = 10         --arbitrary regular guard just because 
    | (x:xs) <- l = undefined  --pattern for the non-empty case

关于haskell - 模式匹配与 guard 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25493757/

相关文章:

haskell - 什么是单态性限制?

pattern-matching - 编译器中 AST 结构的模式匹配

functional-programming - 二进制字符串erlang的第一个字

pattern-matching - AIML中如何匹配两个关键字?

algorithm - SQL语句的模式识别

Agda 的 Haskell 推导机制

haskell - "all"在haskell中的性能

haskell - 如何根据列的值从列表中删除行

Haskell - 将字符串中指定位置的一个字符更改为另一个指定的字符

pattern-matching - 如何匹配具有常量值的结构中的字符串?