Units a = Units a (SymbolicManip a ) deriving (Eq) 我不知道如何解决它?-6ren">
gpt4 book ai didi

haskell - 如何修复 "Illegal datatype context"(使用 -XDatatypeContexts)?

转载 作者:行者123 更新时间:2023-12-01 07:10:26 24 4
gpt4 key购买 nike

我是Haskell的新手,我的代码如下:

data Num a=>Units a = Units a (SymbolicManip a )

deriving (Eq)

我不知道如何解决它?

任何人都可以帮助我吗?

最佳答案

数据类型中的类型类上下文现在被认为是一个不太有用的特性。问题是以下内容无法编译:

foo :: Units a -> a
foo (Units x _) = x+x

这直观地应该编译,因为 Units a只能为类型 a 构造参数满意 Num a .因此,在销毁(模式匹配)时,应该能够访问 Num a实例。然而事实并非如此,还有一个 Num a在销毁时也必须违反直觉:
foo :: Num a => Units a -> a
foo (Units x _) = x+x

因此,标准建议是删除约束 Num a来自 Units a数据类型声明,并将其添加到每个涉及 Units a 的函数中.

另一种选择是启用 GADT 并将数据类型更改为:
data Units a where
Units :: Num a => a -> SymbolicManip a -> Units a

这是“正确”的事情:a Num a需要实例来构造一个值,而是在销毁时提供。这样,第一个 foo上面的声明将是类型良好的。

我几乎忘记了“quick &dirty”选项,该选项用于启用过时的数据类型上下文功能:这是通过在文件开头添加行来完成的
{-# LANGUAGE DatatypeContexts #-}

不过,我宁愿修改代码也不愿启用此语言扩展。

关于haskell - 如何修复 "Illegal datatype context"(使用 -XDatatypeContexts)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22622399/

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