【问题标题】:Haskell type definition is wrongHaskell 类型定义错误
【发布时间】:2017-05-12 03:58:08
【问题描述】:

我刚开始学习 Haskell,我有任务使用高阶函数来创建具有以下类型定义的函数

-- compr :: (a->b) -> (a -> Bool) -> [a] -> [b]

函数不相关,可以是最简单的函数所以我的想法是这样的:

identity x = x
booleans x | x == 1  = True
           | x ==0 = False
           | otherwise = False

compr identity booleans xs  =  filter booleans(map (identity) xs)

但是这个函数有这种类型

compr :: (a->b) -> (b -> Bool) -> [a] -> [b]

我已经尝试了所有方法,但没有任何积极的结果。我希望你能帮助我。

【问题讨论】:

  • 提示:您需要编写一个函数,该函数采用“转换”函数(a -> b)、“谓词”(a -> Bool)as 的列表,仅将“转换”应用于谓词成立的[a] 的成员,并返回结果bs 的列表。你必须先申请filter,然后再申请map
  • 我希望您的函数实际上具有comp :: (a -> a) -> (int -> bool) -> [a] -> [a] 的类型。标识函数必须返回与给定相同的类型。你需要一个修改它的参数的函数。
  • 非常感谢我在正确的轨道上,我先应用地图然后过滤

标签: haskell


【解决方案1】:

您几乎得到它,但您需要在地图之前应用过滤器。这样,过滤器适用于[a] 而不是[b],并且谓词得到正确的类型。

> compr identity booleans xs  = map identity (filter booleans xs)
> :t compr
compr :: (a -> b) -> (a -> Bool) -> [a] -> [b]

顺便说一句,我发现您用于变量的名称具有误导性。比如compr的定义中的identity变量和你之前声明的identity函数没有任何关系。

我建议你改用更通用的变量名,例如

> compr f p xs  = map f (filter p xs)

其中f 代表“函数”,p 代表谓词。

【讨论】:

  • @leo23082014,善待自己
【解决方案2】:

Haskell 中已经有一个名为 id (id :: a -> a) 的标准库函数来替换您的 identity 函数。因此,根据您将如何定义 booleans 函数,您可以按如下方式简化 comp 函数;

booleans x | x == 1    = True
           | otherwise = False

compr :: (a -> Bool) -> [a] -> [a]
compr =  filter booleans . map id

*Main> compr booleans [1,2,3,4]
[1]

【讨论】:

  • booleans = (== 1) 会更简单。
  • @4castle 完全
猜你喜欢
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多