gpt4 book ai didi

haskell - 为什么我不能在这个实例声明中使用类型变量?

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

我正在尝试使用 TypeApplications消除我正在调用的类型类的哪个实例之间的歧义。不幸的是,实例声明的类型参数似乎不能在实例主体中使用。具体来说,在这个玩具示例中:

{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE UndecidableInstances #-}

class Foo a where
foo :: String

instance Foo () where
foo = "()"

instance Foo Int where
foo = "Int"

class Bar b where
bar :: String

instance Foo a => Bar a where
bar = foo @a

会出错 Not in scope: type variable 'a'在最后一行。如果我删除类型应用程序,则会出现错误 Could not deduce (Foo a0) from the context Foo a给出,这是合理的,屁股 foo本身是模棱两可的。

有什么方法可以让我访问类型参数,或者强制编译器识别这一点?

最佳答案

类型变量可以在实例声明中使用,但前提是它有范围:

{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
{-# LANGUAGE TypeApplications, AllowAmbiguousTypes #-}
{-# LANGUAGE ScopedTypeVariables, UnicodeSyntax #-}

class Foo a where foo :: String

class Bar b where bar :: String

instance ∀ a . Foo a => Bar a where
bar = foo @a

一如既往, 也可以写 forall如果您更喜欢 ASCII。

关于haskell - 为什么我不能在这个实例声明中使用类型变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52257056/

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