【问题标题】:Haskell Higher order filter functionHaskell 高阶滤波函数
【发布时间】:2021-06-25 13:53:37
【问题描述】:
filter :: (a -> Bool) -> [a] -> [a]
filter (\x -> x % 2 == 0) [1,2,3,4,5]

我已经编写了上面的代码。我想从列表中取出满足布尔表达式 x % 2 == 0 条件的列表匿名数字返回数字

运行此代码时出现错误

解析错误:顶层的裸表达式 也许你打算使用 TemplateHaskell

刚接触haskell,我不知道该怎么办

【问题讨论】:

  • 你试图调用 filter,而不是定义它。
  • 您是要定义一个名为filter 的新函数,还是要使用前奏中的filter
  • @Brian 尝试使用前奏中的过滤器。前面的定义将过滤器定义为一个函数,它接受一个列表并返回另一个满足布尔条件的列表

标签: haskell higher-order-functions


【解决方案1】:

摆脱类型签名(filter 已定义)并使用调用来定义新变量。

even_numbers = filter (\x -> x % 2 == 0) [1,2,3,4,5]

(顺便说一句,even 是预定义的;你可以写filter even [1,2,3,4,5]。)

如果您尝试定义一个对谓词进行硬编码的filter 版本:

even_numbers :: [a] -> [a]
even_numbers xs = filter even xs

【讨论】:

  • 别忘了在 Haskell 中你应该使用 modrem% 不在 Prelude 中,但最常见的是 Data.Ratio 中 Ratios 的构造函数。或者,您可以直接使用内置函数even
  • 你的错误意味着你声明了一个类型签名filter :: (a -> Bool) -> [a] -> [a]而没有定义伴随的函数filter。但是由于您尝试使用前奏中的filter,因此您不会自己定义它,也不应该包含类型签名。类型签名仅用于定义变量,而不是用于调用它们。
猜你喜欢
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多