where块的语法
Syntax of where block
我正在阅读 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)
我知道这条线存在是因为 three 的类型是 Parser(Char, Char) 但是 g a b c 代表什么? g a b c 在语法上如何有效?我习惯于看到
这样的情况
f :: s -> (a,s)
f x = y
where y = ... x ...
其中每个符号 x 和 y 出现在 where 声明之前。
这是声明函数的语法。相当于
where g = \a b c -> (a,c)
g
是一个函数,它有 3 个参数和 returns 一个元组
How is g a b c
syntactically valid?
出于同样的原因,模块顶层的相同定义也是有效的。 where
和顶级定义之间的区别只是您在函数的头部(例如上一个示例中的 x
)范围内绑定了变量,并且可以在右侧使用它们,但这不是这并不意味着您必须使用它们。
我正在阅读 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)
我知道这条线存在是因为 three 的类型是 Parser(Char, Char) 但是 g a b c 代表什么? g a b c 在语法上如何有效?我习惯于看到
这样的情况f :: s -> (a,s)
f x = y
where y = ... x ...
其中每个符号 x 和 y 出现在 where 声明之前。
这是声明函数的语法。相当于
where g = \a b c -> (a,c)
g
是一个函数,它有 3 个参数和 returns 一个元组
How is
g a b c
syntactically valid?
出于同样的原因,模块顶层的相同定义也是有效的。 where
和顶级定义之间的区别只是您在函数的头部(例如上一个示例中的 x
)范围内绑定了变量,并且可以在右侧使用它们,但这不是这并不意味着您必须使用它们。