gpt4 book ai didi

haskell - 为什么不能推断类型类约束并变得模棱两可?

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

对于以下代码,

func :: Show a => a -> a
func = id

func3 = func . func

编译提示消息
Ambiguous type variable `c0' in the constraint:
(Show c0) arising from a use of `func'
Possible cause: the monomorphism restriction applied to the following:
func3 :: c0 -> c0 (bound at test.hs:6:1)
Probable fix: give these definition(s) an explicit type signature
or use -XNoMonomorphismRestriction.

但是,在 GHCi 中查询它的类型就可以了。
*Main> :t func . func
func . func :: Show c => c -> c

这里发生了什么事?有没有办法拥有 func3 的类型自动推断?

p.s.遵循消息中的说明确实有帮助,但我不明白这里发生了什么。

最佳答案

您可以通过三种方式编译代码。

方法一

您可以禁用单态限制。

{-# LANGUAGE NoMonomorphismRestriction #-}

单态性限制起作用是因为 func3未使用函数语法定义。这导致方法2:

方法二

如果您这样做了:
func3 x = func . func $ x

一切都会好起来的。单态性限制是一个规则,可以保护您避免“意外”定义多态值。众所周知,它在某些常见情况下过于严格,并且偏离了标准的 Hindley-Milner 类型推断。

方法三

当然,你能做的最后一件事是给你的函数一个明确的类型签名。
func3 :: Show a => a -> a
func3 = func . func

单态限制意味着任何没有函数语法声明的值(即 = 的左侧没有参数)将不会自动获得多态类型。

关于haskell - 为什么不能推断类型类约束并变得模棱两可?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21654124/

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