【问题标题】:how do you change the following haskell code into a high order function?您如何将以下haskell代码更改为高阶函数?
【发布时间】:2016-04-21 21:09:14
【问题描述】:

定义一个函数

rmdups :: Eq a => [a] -> [a]

从列表中删除重复项。例如,rmdups "ababca" 应该返回 "abc"。输出列表中元素的顺序并不重要

这是我到目前为止所做的: 这有效:

 rmdups :: Eq a => [a] -> [a]
 rmdups [] = []
 rmdups (x:xs) = x : rmdups (filter(/= x) xs)

这不起作用,我做错了什么:

 rmdups = map head . group . sort

【问题讨论】:

  • 它适用于您给出的示例。什么是它不起作用的例子?
  • 没有最后一行代码不起作用。编译器说组不在范围内。
  • 啊,正如 baxbaxwalanuksiwe 所说,这是因为您缺少 import。在以后的问题中,您应该包含收到的任何错误消息。

标签: haskell


【解决方案1】:

你可以这样做:

import Data.List (nub)
rmdups = nub

但我认为你是不允许的。

否则,您的解决方案 (rmdups = map head . group . sort) 对我有用。

If the compiler says group or sort not in scope,只需从Data.List 导入即可。

PS:我相信你的意思是“point free style”,而不是“higher order function”

编辑:感谢user3217013 指出that

【讨论】:

  • 你还需要 Data.List 来代替 sort,出于某种莫名其妙的原因。
  • 感谢您的回答,但就像您说的那样,我不允许这样做。有没有其他方法可以解决这个问题,使用高阶函数。
  • 为什么不允许你这样做?我的解决方案(实际上是你的)使用高阶函数map
  • 任务说我只需要声明 import Data.List (sort) 就可以了。
  • 然后尝试编写您自己的group 版本。或者尝试用另一种方式编写函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 2019-09-18
相关资源
最近更新 更多