Haskell有隐式模式匹配吗?
拿这个例子:
module Main where
main = print (reverseWords "lol")
reverseWords :: String -> [String]
reverseWords = words
reverseWords函数不是针对任何参数的模式匹配,但函数运行和输出"[lol]"。
我在这里有两个问题:
-
Haskell 如何知道我是否正在
words针对 的输入调用函数reverseWords?在这个语法中,看起来我只是在返回函数words。 -
为什么即使我没有在模式中提供任何输入参数,它也能成功运行
reverseWords?
回答
你只是说这reverseWords 就是函数words。任何reverseWords出现的地方,都可以用函数 代替words。所以print (reverseWords "lol")完全等同于print (words "lol"). 基本上,你有这个新函数reverseWords,它String像 do 一样接受一个参数words,并简单地将该参数传递给words,返回words该参数的任何返回值。你的定义reverseWords相当于:
reverseWords :: String -> [String]
reverseWords s = words s
鉴于所有这些,reverseWords是一个误导性的名称,因为它与words. 所以,你根本没有做任何有用的事情,只是重命名了一些东西。一个更好的例子是这样的:
reverseWords :: String -> [String]
reverseWords = reverse . words
reverse您words使用组合运算符组合的其他一些函数在哪里(.)可以创建一个有用的新函数。这称为无点样式,您可以通过组合其他函数而不引用任何参数来定义新函数。该定义等效于:
reverseWords :: String -> [String]
reverseWords s = reverse (words s)