语法,其中块

问题描述:

我读编程在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)的范围,可以在右侧使用它们,但这并不意味着你使用他们。