do let (Ide-6ren">
gpt4 book ai didi

haskell - 奇怪的 ghc 错误消息, "My brain just exploded"?

转载 作者:行者123 更新时间:2023-12-03 12:17:53 26 4
gpt4 key购买 nike

当我尝试对 proc 中的 GADT 进行模式匹配时语法(使用 Netwire 和 Vinyl):

sceneRoot = proc inputs -> do
let (Identity camera :& Identity children) = inputs
returnA -< (<*>) (map (rGet draw) children) . pure

我从 ghc-7.6.3 得到(相当奇怪的)编译器错误

我的大脑刚刚爆炸
我无法处理存在或 GADT 数据构造函数的模式绑定(bind)。
相反,使用 case-expression 或 do-notation 来解压缩构造函数。
在模式中: Identity cam :& Identity childs

将模式放入 proc (...) 时出现类似错误图案。为什么是这样?它是不健全的,还是只是未实现?

最佳答案

考虑 GADT

data S a where
S :: Show a => S a

和代码的执行
foo :: S a -> a -> String
foo s x = case s of
S -> show x

在基于字典的 Haskell 实现中,人们会期望值 s带有类字典,而 case提取 show来自所述字典的函数,以便 show x可以执行。

如果我们执行
foo undefined (\x::Int -> 4::Int)

我们得到一个异常(exception)。在操作上,这是意料之中的,因为我们无法访问字典。
更一般地说, case (undefined :: T) of K -> ...将产生错误,因为它会强制评估 undefined (前提是 T 不是 newtype )。

现在考虑代码(让我们假设它编译)
bar :: S a -> a -> String
bar s x = let S = s in show x

和执行
bar undefined (\x::Int -> 4::Int)

这应该怎么做?有人可能会争辩说它应该产生与 foo 相同的异常。 .如果是这种情况,引用透明度将意味着
let S = undefined :: S (Int->Int) in show (\x::Int -> 4::Int)

失败以及同样的异常(exception)。这意味着 let正在评估 undefined表达,非常不同,例如
let [] = undefined :: [Int] in 5

计算结果为 5 .

确实, let 中的模式是懒惰的:它们不强制评估表达式,不像 case .这就是为什么例如
let (x,y) = undefined :: (Int,Char) in 5

成功评估为 5 .

有人可能想制作 let S = e in e'评估 e如果是 show e' 中需要,但感觉很奇怪。此外,在评估 let S = e1 ; S = e2 in show ... 时是否评估 e1 尚不清楚, e2 , 或两者。

GHC 目前选择用一个简单的规则来禁止所有这些情况:消除 GADT 时没有惰性模式。

关于haskell - 奇怪的 ghc 错误消息, "My brain just exploded"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23531566/

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