Maybe a -> [Char] foo (Just x) = show x foo Nothing = "Nothing" 然后我尝试使用这个功能-6ren">
gpt4 book ai didi

Haskell: "ambiguous type variable arising from using a function",其中所说的变量实际上并不重要

转载 作者:行者123 更新时间:2023-12-02 16:53:06 25 4
gpt4 key购买 nike

考虑以下函数:

foo :: Show a => Maybe a -> [Char] 
foo (Just x) = show x
foo Nothing = "Nothing"

然后我尝试使用这个功能:

bar :: [Char]
bar = foo Nothing

传递给 foo 的参数是 Maybe a 类型,其中 a 未指定,实际上我们并不关心关于 a,因为我们仅使用 foo 的情况来表示 Nothing。但GHC声称提供了具体类型:

Ambiguous type variable a0 arising from a use of foo
prevents the constraint (Show a0) from being solved. Probable fix: use a type annotation to specify what a0 should be.

GHC 提示指定类型。因此,我看到的唯一修复方法是创建一个具有 Show 类型类实例的假类型:

{-# LANGUAGE EmptyDataDecls, KindSignatures #-}
{-# OPTIONS_GHC -fno-warn-missing-methods #-}

data Dummy :: *

instance Show Dummy

bar :: [Char]
bar = foo (Nothing :: Maybe Dummy)

foo :: Show a => Maybe a -> [Char]
foo (Just x) = show x
foo Nothing = "Nothing"

它有效,但似乎非常简单。但我不喜欢这个解决方案的真正原因是,出于我的目的,此代码是从一些元数据自动生成的,它不提供有关必须将哪种特定多晶型类型指定为 Dummy 的信息(可能存在具有多个参数的用户数据类型)。所以我想知道,有没有办法告诉GHC,如果没有指定类型,这个类型不重要?

最佳答案

“无关紧要”是实例的属性,并且 ghc 不会内省(introspection)这样的实例。对于某些类型来说,这确实很重要。 [a]Show 实例取决于类型 a,即使列表为空也是如此。查看 show ([]::[Char]) 的结果与 show ([]::[Int]) 的结果。

但所有这些都是旁白。事实上,类型是在编译时确定的,但值是在运行时确定的。您提出了一种情况,其中类型变量仅对某些输入值无关紧要。在这种情况下,类型变量仍然很重要,因为它们控制其他情况下的行为。

您必须正确解决不明确的类型,因为 ghc 就是这样知道要使用哪个代码的。有一些技术可以方便地做到这一点,例如使用 ScopedTypeVariables 扩展,但如果没有更具代表性的代码,则很难推荐一种技术。不过,我能说的最重要的是,它确实很重要,因为实例选择是在编译时完成的,早在看到值之前就完成了。

关于Haskell: "ambiguous type variable arising from using a function",其中所说的变量实际上并不重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53210354/

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