gpt4 book ai didi

haskell - where 语法是如何工作的?

转载 作者:行者123 更新时间:2023-12-01 12:20:37 25 4
gpt4 key购买 nike

我正在从 GitHub 寻找这个解决方案,以解决 Haskell from First Principles 一书中提出的问题。这是代码

data Nat =
Zero
| Succ Nat deriving (Eq, Show)

integerToNat :: Integer -> Maybe Nat
integerToNat i
| i < 0 = Nothing
| i == 0 = Just Zero
| i > 0 = Just (Succ x) where (Just x) = integerToNat $ i-1

我很困惑

where (Just x) = integerToNat $ i-1

我以为我只能在 where 中将表达式分配给标识符。但它看起来像 (Just x) 解压分配的表达式的值并将 x 分配回 (Succ x)

有人能解释一下为什么会这样吗?

最佳答案

Haskell context free syntax , 有一个关于函数的右侧 (rhs) 的条目:

rhs → = exp [where decls]
        | gdrhs [where decls]

所以这意味着我们必须查看 decls 以获得 where 语法。 declsdecl 的序列:

decls → { decl1; ...; decln }

decl 也有两个可能的规则:

decl→ gendecl
        | (funlhs | pat) rhs

这意味着我们可以在 where 子句的左侧声明模式 (pat)。实际上在 where a = 1 中,a 可以说已经是一种模式了。该模式由一个变量组成。但是构造函数、别名运算符等都可以放在 where 子句的左侧。

模式可以是变量、泛型构造函数、限定构造函数、文字、通配符、列表模式、元组模式、不可反驳模式等。然后可以找到模式的完整语法here .所以简而言之,它的工作方式类似于函数头部的模式匹配。

关于haskell - where 语法是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44484597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com