gpt4 book ai didi

haskell - 添加类型签名会导致编译错误

转载 作者:行者123 更新时间:2023-12-04 07:38:35 25 4
gpt4 key购买 nike

在 Haskell 中,我可以定义这样的函数:

foo :: Int -> Int
foo n = n + 1

如果我想成为肛门,我可以在最后一行添加一个类型签名,如下所示:
foo :: Int -> Int
foo n = n + 1 :: Int

我也可以定义一个函数 bar就这样的类型类而言:
class Rel a b where
aToB :: a -> b

bar :: (Rel a b) => a -> b
bar a = aToB a

但是,如果我在 bar 的实现中添加类型签名(一个良性变化,或者我认为),我得到一个编译错误。
bar :: (Rel a b) => a -> b
bar a = aToB a :: b

这是错误:
Could not deduce (Rel a b1) arising from a use of `aToB'
from the context (Rel a b)
bound by the type signature for bar :: Rel a b => a -> b
at q.hs:79:1-23
Possible fix:
add (Rel a b1) to the context of
an expression type signature: b1
or the type signature for bar :: Rel a b => a -> b
In the expression: aToB val :: b
In an equation for `bar': bar val = aToB val :: b

我认为这个错误意味着编译器不相信 b在执行 barb 相同在 bar 的类型签名中.但是,我不确定为什么会这样。

当我向函数实现添加类型签名时,为什么会出现此编译错误?

最佳答案

你实际上需要一个语言扩展和一些额外的语法来使这两个 b类型变量相同:

{-# LANGUAGE ScopedTypeVariables #-}
bar :: forall a b . (Rel a b) => a -> b
bar a = aToB a :: b
forall本质上是说“ ab 应该在整个定义的范围内”,和 ScopedTypeVariables需要被允许使用这种语法。

我想这确实是语言设计中的一个历史性缺陷。

关于haskell - 添加类型签名会导致编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21270107/

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