我正在阅读Graham Hutton编写的Haskell编程,它在第13章中给出了以下代码:
import Control.Applicative
import Data.Char
{- some code omitted -}
newtype Parser a = P (String -> [(a, String)])
item :: Parser Char
item = P (\ input -> case input of
[] -> []
x:xs -> [(x,xs)])
three :: Parser (Char,Char)
three = pure g <*> item <*> item <*> item
where g a b c = (a,c)
我很难理解最后一行
where g a b c = (a,c)
据我所知,这一行存在是因为三行有类型Parser(Char,Char),但g a b c代表什么? g a b c语法有效吗?我习惯于看到像
这样的情况f :: s -> (a,s)
f x = y
where y = ... x ...
其中每个符号x和y出现在where声明之前。
答案 0 :(得分:9)
声明一个函数是语法。它相当于
where g = \a b c -> (a,c)
g
是一个函数,它接受3个参数并返回一个元组
答案 1 :(得分:2)
g a b c
语法上有效吗?
出于同样的原因,它在模块的顶层上的相同定义是有效的。 where
和顶级中定义之间的差异只是你在范围内有函数头部的变量(例如你最后一个例子中的x
)并且可以在右侧使用它们,但这并不是'这意味着你 使用它们。