gpt4 book ai didi

haskell - 如何为返回幻像类型的幻像类型创建实例?

转载 作者:行者123 更新时间:2023-12-02 11:10:40 27 4
gpt4 key购买 nike

让我们有以下数据类型:

data Foo1 a = Foo1
data Foo2 a = Foo2 (Foo3 a)
data Foo3 a = C1 (Foo1 a) | C2 Int

现在我们希望能够从 Foo1 或 Int 获取 Foo3。解决方案可能是使用类型类:

class ToFoo3 a where
toFoo3 :: a -> Foo3 b -- Here start the problems with this phantom type b...

instance ToFoo3 (Foo1 b) where
toFoo3 foo1 = C1 foo1

instance ToFoo3 Int where
toFoo3 int = C2 int

这里编译器提示(正确地!)它无法将 b 与 b1 匹配,因为类定义中 Foo3 的“b”与实例中 Foo1 的“b”不同。

有办法解决这个问题吗?

最佳答案

为我编译一个没有函数依赖的多参数类型类:

{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}

data Foo1 a = Foo1
data Foo2 a = Foo2 (Foo3 a)
data Foo3 a = C1 (Foo1 a) | C2 Int

class ToFoo3 a b where
toFoo3 :: a -> Foo3 b

instance ToFoo3 (Foo1 b) b where
toFoo3 foo1 = C1 foo1

instance ToFoo3 Int b where
toFoo3 int = C2 int

按照我的理解,在任何一个方向上都不能有函数依赖,因为 Int 需要能够转换为任何 Foo3 a 类型,并且 Foo1 a 需要能够转换为相同的 Foo3 a 类型。

当然,这意味着您不能期望 toFoo3 的任何参数或结果类型来帮助推断另一个,因此您有时可能需要大量烦人的类型注释来使用它,但其他这应该可行。

编辑:我假设您希望能够使用 a 从 Foo1 a 转换为 Foo3 b b 不同。如果我错了,那么如果将一个实例更改为

,那么带有单参数类的操作代码应该可以工作
instance ToFoo3 (Foo1 b) where
toFoo3 Foo1 = C1 Foo1

关于haskell - 如何为返回幻像类型的幻像类型创建实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26602071/

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