新手在sort.words上

时间:2012-01-13 22:23:30

标签: haskell

这个表达式:

sort words "fire water earth fire"

---给出了这个错误---

Couldn't match expected type `[a]'
against inferred type `GHC.Base.String -> [GHC.Base.String]'

有人可以向我解释这里发生了什么,以及如何优雅地表达sort.words?

2 个答案:

答案 0 :(得分:8)

你想要这个:

sort (words "fire water earth fire")

当你做

sort words "fire water earth fire"

它实际上在做

(sort words) "fire water earth fire"

sort需要一个列表([a]),但你要给它words,这是一个函数接受一个字符串并返回一个字符串列表({{1} }),因此错误消息(它不能将String -> [String]视为任何事物的列表)。

你也可以这样做:

String -> [String]

相当于第一个版本,可能看起来更整洁。

答案 1 :(得分:3)

函数应用程序从左侧开始关联,因此解析为(sort words) "fire water earth fire"。不用说,对函数words进行排序不会很好!因此,错误消息告诉您sort期望类型[a]的参数(即列表),但您已将其应用于String -> [String]类型的某些内容,即{ {1}}。

您想要words或使用更常见的习语sort (words "fire water earth fire")sort $ words "fire water earth fire"运算符只是函数应用程序,但它具有非常低的右关联优先级,所以它经常在这样的表达式中使用,以避免写出括号。