gpt4 book ai didi

Haskell:在另一个类的实例中使用一个类

转载 作者:行者123 更新时间:2023-12-03 13:22:37 25 4
gpt4 key购买 nike

我有以下方案的代码:

class First s where
func1 :: s -> s
class Second a where
func2 :: s -> a s

data D s = D {value :: s}
myFunc2 :: First s => s -> D s
myFunc2 = undefined

通常,func2 的参数不能是 First 的实例。我只想在它是 First 的值实例的情况下使 D 实例成为 Second 。
然后我想得到这个实例:
instance Second D where
func2 = myFunc2

但我收到一个错误:
No instance for (First s)
arising from a use of `myFunc2'

好的,让实例是:
instance First s => Second D where
func2 = myFunc2

但这给出了错误:
Ambiguous constraint `First s'
At least one of the forall'd type variables mentioned by the constraint
must be reachable from the type after the '=>'
In the instance declaration for `Second D'

那么,有没有办法从其他类获取具有某些条件的类的实例,但在“=>”之后没有所有类型变量?

最佳答案

我认为这有助于思考什么是定性的

class Second a where
func2 :: s -> a s
Second 实例 promise 为任何类型 func2 定义 s 。但 myFunc2 不是这样,因为 myFunc2 只为那些存在 s 实例的 First 定义。这意味着,由于您已经定义了 FirstSecond ,因此不可能在 myFunc2 实例中使用 Second (除非存在一个包罗万象的 forall s . First s 实例,但我假设没有,否则您就不会费心制作类型类)。

所以,你至少要改变一件事。您可以按照 Grzegorz 的建议重新定义 Second。如果你不喜欢那样,你可以重新定义 Second
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}

class Second a s where
func2 :: s -> a s

instance First s => Second D s where
func2 = myFunc2

请注意,这与您最初编写的内容有所不同,因为现在 Second 实例并不能保证 func2 是多态的。但是我认为这更接近于您所说的“仅在它是 First 的值实例的情况下使 D 实例成为 Second”时的意思。也许它在您的代码中是可以接受的。

关于Haskell:在另一个类的实例中使用一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9714229/

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