【发布时间】:2016-09-11 03:45:41
【问题描述】:
在Haskell Programming from First Principles一书中有一个练习告诉我们编写一个函数,该函数接受一个带有空格的字符串,用空格分割它,然后加载非空格块到字符串列表中。我的第一次尝试是:
splitString :: String -> [String]
splitString str
| str == "" = []
| otherwise = takeWhile (/=' ') str : splitString $ drop 1 $ dropWhile (/=' ') str
现在这不能编译。如果我将第一个 ($)(紧跟在 splitString 之后)替换为相应的括号对,如下所示:
takeWhile (/=' ') str : splitString (drop 1 $ dropWhile (/=' ') str)
然后就可以了。不过,根据我迄今为止对 ($) 的了解,两者不应该是等价的吗? ($) 是正确关联的,所以在我看来应该发生的事情是
-
dropWhile (/=' ') str先评估 -
drop 1 (dropWhile (/=' ') str)是下一个 - 然后将结果传递给
splitString。
相反,我收到来自ghc 的错误,上面写着
Couldn't match expected type ‘[Char] -> [String]’
with actual type ‘[[Char]]’
The first argument of ($) takes one argument,
but its type ‘[[Char]]’ has none
我可以通过“($) 的第一个参数”看到它在谈论 splitString,但我对声明的内容感到困惑
but its type `[[Char]]` has none
应该是这个意思。
【问题讨论】:
-
你知道你只是在实现
words,对吧? -
@chepner:不……我不知道。我是 Haskell 的初学者。我只是想知道它是如何工作的。
-
为什么投反对票?每个人总是将
$运算符解释为与括号相同的东西,但显然不是在这种情况下。我觉得了解原因很重要。 -
$减少了对括号的需要;任何真正说他们是 same 的人充其量只是在误导。f 3 + 5与(f 3) + 5相同,因为函数应用的优先级高于+。f $ 3 + 5与f (3 + 5)相同,因为$的优先级低于+。 -
投反对票的人(不是我)大概认为您可以自己查找
($)的定义。
标签: haskell