阻止

时间:2017-07-16 06:54:03

标签: haskell syntax notation

我正在阅读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声明之前。

2 个答案:

答案 0 :(得分:9)

声明一个函数是语法。它相当于

 where g = \a b c -> (a,c)

g是一个函数,它接受3个参数并返回一个元组

答案 1 :(得分:2)

  

g a b c语法上有效吗?

出于同样的原因,它在模块的顶层上的相同定义是有效的。 where和顶级中定义之间的差异只是你在范围内有函数头部的变量(例如你最后一个例子中的x)并且可以在右侧使用它们,但这并不是'这意味着你 使用它们。