gpt4 book ai didi

class - Haskell - 类与类型类 - 有什么区别

转载 作者:行者123 更新时间:2023-12-04 06:46:55 25 4
gpt4 key购买 nike

你好 Haskellers 和 Haskellettes,

我一直在摆弄 Haskell 很长一段时间,但是我无法完全掌握这个类的概念。在以下示例中,我的数据类型为 ExprTree

data Val a = Num a | Var String deriving (Eq, Ord, Show)
data ExprTree = Leaf {lab::Label, val::(Val a)=> a}
| Node {lab::Label, fun::Fun, lBranch::ExprTree, rBranch::ExprTree}
deriving(Eq,Ord)

这导致
Type constructor `Val' used as a class In the definition
of data constructor `Leaf' In the data type declaration for `ExprTree'

我也试过
data ExprTree' = Leaf {lab::Label, val::Val}
...

但随机更改类型签名 - 听起来既不有效也不提供启发。

现在据我所知 Num a表示 Num 类的东西但这不是数据类型的实例吗 - 并且不允许我编译。
那么我必须做什么才能制作 ExprTree定义明确。

提前感谢您的提示和想法!

编辑 :

1)感谢您的快速答复!

2) 我更改了 val::(Val a)=>aval::Val a
我有类似的想法 - 但随后出现错误: Not in scope type variable a发生
你有额外的建议吗?

最佳答案

回答标题中的问题:在谈论 Haskell 时,“类”一词几乎总是用来表示“类型类”,因为这是 Haskell 中唯一的类。所以没有区别。

回答你 body 里的问题:

data ExprTree a =
Leaf {lab::Label, val::(Val a)}
| Node {lab::Label, fun::Fun, lBranch::(ExprTree a), rBranch::(ExprTree a)}
deriving(Eq,Ord)

写作 (Val a)=>a没有意义,因为 Val不是类型类,你不能只在类型定义的右侧引入类型类约束(无论如何都没有扩展 - 无论哪种方式都不是你想要的)。

关于class - Haskell - 类与类型类 - 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6524071/

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