【问题标题】:Syntax of where blockwhere 块的语法
【发布时间】:2017-07-16 06:54:03
【问题描述】:

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

【问题讨论】:

    标签: haskell syntax notation


    【解决方案1】:

    这是声明函数的语法。相当于

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

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

    【讨论】:

      【解决方案2】:

      g a b c 在语法上如何有效?

      它有效的原因与模块顶层的相同定义有效的原因相同。 where 和顶级定义之间的区别只是你在函数的头部绑定了变量(例如你最后一个例子中的x),并且可以在右侧使用它们,但这并不意味着你 必须使用它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-10
        • 2019-12-03
        • 1970-01-01
        • 1970-01-01
        • 2012-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多