gpt4 book ai didi

haskell - 了解 Haskell RankNTypes 错误消息

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

我正在尝试了解 RankNTypes。

为什么编译器在这种情况下会提示 a 不是 [a]

> :{
> | tupleF2 :: (forall a . a -> b) -> (a1, a2) -> (b, b)
> | tupleF2 elemF2 (x, y) = (elemF2 x, elemF2 y)
> | :}

> :t tupleF2 tupleF2 :: (forall a. a -> b) -> (a1, a2) -> (b, b)

> :t tupleF2 length

<interactive>:1:9: error:
• Couldn't match type ‘a’ with ‘[a0]’
‘a’ is a rigid type variable bound by
a type expected by the context:
forall a. a -> Int
at <interactive>:1:1-14
Expected type: a -> Int
Actual type: [a0] -> Int
• In the first argument of ‘tupleF2’, namely ‘length’
In the expression: tupleF2 length

虽然下面的类型检查没问题?并且 t 可以与 t a 一起使用。

> :t tupleF length
tupleF length :: Foldable t => (t a, t a) -> (Int, Int)
:t tupleF
tupleF :: (t -> b) -> (t, t) -> (b, b)

上述编译失败是否仅在启用 RankNTypes 时发生。任何了解正在发生的事情的指示都会很棒。

谢谢。

最佳答案

forall a . a -> b 是函数 f 的类型,它可以将任何类型 a 的值转换为 b 类型的值>。请注意,f 必须准备好接受任何输入,即所有这些都必须进行类型检查

f ()
f 32
f True
f 'a'
f "hello"
f (True, [2], False)

length 不满足要求,例如length () 类型错误——length 想要一个可折叠的(如列表)作为输入,而 () 不正确。

因此,tupleF2 长度 类型错误。

实用上,请注意f 只能是常量函数,例如

f x = True  -- assuming b = Bool

事实上,参数化 保证只有常量函数可以具有 forall a 类型。 a -> b。您可以尝试 tupleF2 (const True) ((),"hello") 并获得 (True, True)

关于haskell - 了解 Haskell RankNTypes 错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56065005/

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