我正在观看有关Haskell中解析器的教程:https://www.youtube.com/watch?v=9FGThag0Fqs。讲座从定义一些非常基本的解析器开始。这些解析器将在后面用于创建更复杂的解析器。其中一个基本解析器是item。它用于从我们正在解析的字符串中提取一个字符。
所有解析器都具有以下类型:
解析器“item”的定义如下所示:
讲师对此发表了简短的评论,认为这样做看起来更清晰,但我不同意。所以我的问题是:
它们确实完全相同吗? 为什么lambda版本更清晰?
所有解析器都具有以下类型:
type Parser a = String -> [(a, String)]
解析器“item”的定义如下所示:
item :: Parser Char
item = \inp -> case inp of
[] -> []
(x:xs) -> [(x,xs)]
我不太习惯这种语法,所以它对我来说看起来很奇怪。我会这样写:
item' :: Parser Char
item' [] = []
item' (x:xs) = [(x,xs)]
在GHCi中的测试表明它们是相等的:
*Main> item ""
[]
*Main> item "abc"
[('a',"bc")]
*Main> item' ""
[]
*Main> item' "abc"
[('a',"bc")]
讲师对此发表了简短的评论,认为这样做看起来更清晰,但我不同意。所以我的问题是:
它们确实完全相同吗? 为什么lambda版本更清晰?