gpt4 book ai didi

haskell - 奇怪的波形符语法

转载 作者:行者123 更新时间:2023-12-01 23:41:53 27 4
gpt4 key购买 nike

GHC 接受此代码,但它应该是非法语法(?)对发生的情况有任何猜测吗?

module Tilde  where

~ x = x + 2 -- huh?

~ x +++ y = y * 3 -- this makes sense

(+++) 等式很有意义:它声明一个运算符,使用中缀语法,并对第一个参数使用无可辩驳的模式匹配。

第一个“方程”一开始看起来是一样的。但没有运营商。如果我问

λ> :i ~
===> <interactive>:1:1: error: parse error on input `~'

λ> :i (~)
===> class (a ~ b) => (~) (a :: k) (b :: k)
-- Defined in `Data.Type.Equality'
instance [incoherent] forall k (a :: k) (b :: k). (a ~ b) => a ~ b
-- Defined in `Data.Type.Equality'

这是一个令人困惑的发现,但与它无关(?)我无法定义自己的类或运算符(~) -- 内置语法的非法绑定(bind),毫不奇怪。

哦:

λ> :i x
===> x :: Integer -- GHCi defaulting, presumably

并尝试永远运行x循环。所以奇怪之处实际上是定义

x = x + 2

那么~在做什么?

最佳答案

写作

x = 5

创建一个名为x的全局变量,绑定(bind)到值5。添加波形符使模式匹配无可辩驳,但它已经是无可辩驳的,所以这没有多大意义。但这样写是合法的

(xs, ys) = span odd [1..10]

这定义了两个全局变量,xsys,包含 1 到 10 之间的所有奇数和所有偶数。如果你想要通过添加波浪号。当然,这种模式不会失败(如果表达式类型正确),因此没有意义。但请考虑:

~(x:xs) = filter odd [1..10]

这定义了两个全局变量,xxs如果过滤器至少返回一个结果。如果过滤器返回个结果,则模式匹配将会失败。 (实际上,这意味着访问 xxs 将引发模式匹配失败异常。)

甚至可以写出完全奇怪的东西,比如

False = True

这个看似无意义的声明模式将模式 False 与值 True 进行匹配,但无论如何都不执行任何操作。这是该语言中那些不起眼的角落之一。

关于haskell - 奇怪的波形符语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55592519/

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