Haskell有隐式模式匹配吗?

拿这个例子:

module Main where

main = print (reverseWords "lol")
  
reverseWords :: String -> [String]  
reverseWords = words

reverseWords函数不是针对任何参数的模式匹配,但函数运行和输出"[lol]"

我在这里有两个问题:

  1. Haskell 如何知道我是否正在words针对 的输入调用函数reverseWords?在这个语法中,看起来我只是在返回函数words

  2. 为什么即使我没有在模式中提供任何输入参数,它也能成功运行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

reversewords使用组合运算符组合的其他一些函数在哪里(.)可以创建一个有用的新函数。这称为无点样式,您可以通过组合其他函数而不引用任何参数来定义新函数。该定义等效于:

reverseWords :: String -> [String]
reverseWords s = reverse (words s)


以上是Haskell有隐式模式匹配吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>