VarDecl 𝔪 γ -6ren">
gpt4 book ai didi

haskell - "illegal type synonym family"的解释

转载 作者:行者123 更新时间:2023-12-04 04:31:57 24 4
gpt4 key购买 nike

我只是好奇我为什么要写这个,

instance (HzMonad 𝔪, Data.Suitable.Suitable 𝔪 α, γ ~ ExprTyp 𝔪 α) => VarDecl 𝔪 γ where
var = varhz

而不是这个
instance (HzMonad 𝔪, Data.Suitable.Suitable 𝔪 α) => VarDecl 𝔪 (ExprTyp 𝔪 α) where
var = varhz

-- error
Hz2/Language.hs:114:53:
Illegal type synonym family application in instance: ExprTyp 𝔪 α
In the instance declaration for `VarDecl 𝔪 (ExprTyp 𝔪 α)'

在哪里
varhz ::
(HzMonad 𝔪, Data.Suitable.Suitable 𝔪 α) =>
String -> ExprTyp 𝔪 α -> 𝔪 (ExprTyp 𝔪 α)

无论如何,波浪号是什么?非常感谢。

最佳答案

我认为问题在于右侧的所有内容=>必须是类型构造函数或类型变量。 ExprTyp 可以引用多个不同类型的构造函数。用等式约束替换它确实会起作用,但生成的实例实际上是无用的,因为编译器将无法推断出任何关于 γ 的信息。考虑到它是一个 ExprTyp——ExprTyp 可以是任何东西的别名。

在我的情况下——我正在尝试编写一个 DSL monad——解决方案是将关联类型的所有用途包装在一个 newtype 构造函数中。例如,如果我们开始,

class MyDSL m a where
type ExprTyp m :: * -> *
printE :: ExprTyp m a -> m ()

然后包装这将导致
newtype ExprT a = ExprT a
class MyDSL m a where
type ExprTyp m :: * -> *
printE :: ExprT (ExprTyp m a) -> m ()

然后,例如,变量声明(我正在为元组变量声明编写代码)可以是,
instance (HzMonad 𝔪, Data.Suitable.Suitable 𝔪 α, γ ~ ExprTyp 𝔪 α) => VarDecl 𝔪 (ExprT γ)
instance (Monad 𝔪, VarDecl 𝔪 α, VarDecl 𝔪 β) => VarDecl 𝔪 (α, β)

如果有不清楚的地方,请发表评论。

关于haskell - "illegal type synonym family"的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7523288/

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