语法,其中块
问题描述:
我读编程在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)
我知道这行存在,因为三个类型解析器(Char,Char),但gabc代表什么? g a b c如何在语法上有效?我已经习惯了看到每个符号x和y在哪里声明之前出现在哪里像案件
f :: s -> (a,s)
f x = y
where y = ... x ...
。
答
这是声明函数的语法。它是相当于
where g = \a b c -> (a,c)
g
是一个函数,它接受3个参数,并返回一个元组
答
如何为
g a b c
语法有效?
由于相同的原因,模块顶层的相同定义是有效的。在where
定义和顶层之间的区别就是,你必须在功能上的头部约束变量(例如,在您的最后一个例子x
)的范围,可以在右侧使用它们,但这并不意味着你有使用他们。