gpt4 book ai didi

haskell - 单态约束对类型类约束的影响

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

此代码在 baz 的类型声明时中断被添加:

baz (x:y:_) = x == y
baz [_] = baz []
baz [] = False

一个常见的解释(见 Why can't I declare the inferred type? 的例子)是因为多态递归。

但是这种解释并不能解释为什么效果在另一个多态递归示例中消失了:
foo f (x:y:_) = f x y
foo f [_] = foo f []
foo f [] = False

它也没有解释为什么 GHC 认为没有类型声明的递归是单态的。

可以用 reads 解释例子吗?在 http://www.haskell.org/onlinereport/decls.html#sect4.5.5适用于我的 baz案子?

IE。添加签名会消除单态性限制,并且如果没有限制,则会出现右侧 [] 的歧义,其“固有歧义”类型为 forall a . Eq a => [a] ?

最佳答案

baz 的方程式在一个绑定(bind)组中,在输入整个组之后进行泛化。没有类型签名,这意味着 baz假设有一个单型,所以 [] 的类型在递归调用中是由那个给出的(查看 ghc 的 -ddump-simpl 输出)。使用类型签名,编译器被明确告知该函数是多态的,因此它不能假定 [] 的类型在递归调用中是相同的,因此它是模棱两可的。

正如约翰 L 所说,在 foo , 类型由 f 的出现固定- 只要 f有单型。您可以通过给出 f 来创建相同的歧义。与 (==) 相同的类型(需要 Rank2Types ),

{-# LANGUAGE Rank2Types #-}
foo :: Eq b => (forall a. Eq a => a -> a -> Bool) -> [b] -> Bool
foo f (x:y:_) = f x y
foo f[_] = foo f []
foo _ [] = False

这给了
Ambiguous type variable `b0' in the constraint:
(Eq b0) arising from a use of `foo'
Probable fix: add a type signature that fixes these type variable(s)
In the expression: foo f []
In an equation for `foo': foo f [_] = foo f []

关于haskell - 单态约束对类型类约束的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8270548/

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