作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想定义一个新的抽象数据类型,它可以是通用数字或除法结构。我将如何在 Haskell 中做到这一点?
我的第一个方法是:
data MyMath = MyNum Num
| Div MyMath MyMath
问题是编译器提示“Num”不是数据类型而是类型类。所以我的第二个想法是像这样解决问题:
data MyMath = MyNum Int
| MyNum Float
| Div MyMath MyMath
但这也行不通,因为 MyNum 被使用了两次,这是不允许的,此外,这种方法实际上不是多态的。那么这个问题的解决方案是什么?
EDIT2:(再次)阅读答案后,我尝试使用 GADT 数据构造函数。这是一些人工示例代码:
5 data MyMathExpr a where
6 MyNumExpr :: Num a => a -> MyMathExpr a
7 MyAddExpr :: MyMathExpr b -> MyMathExpr c -> MyMathExpr (b, c)
8 deriving instance Show(MyMathExpr a)
9 deriving instance Eq(MyMathExpr a)
10
11 data MyMathVal a where
12 MyMathVal :: Num a => a -> MyMathVal a
13 deriving instance Show(MyMathVal a)
14 deriving instance Eq(MyMathVal a)
15
16 foo :: MyMathExpr a -> MyMathVal a
17 foo (MyNumExpr num) = MyMathVal num
18 foo (MyAddExpr num1 num2) = MyMathVal (l + r)
19 where (MyMathVal l) = foo num1
20 (MyMathVal r) = foo num2
但是第 18 行有问题:
test.hs:18:40:
Couldn't match type `b' with `(b, c)'
`b' is a rigid type variable bound by
a pattern with constructor
MyAddExpr :: forall b c.
MyMathExpr b -> MyMathExpr c -> MyMathExpr (b, c),
in an equation for `foo'
at test.hs:18:6
In the first argument of `(+)', namely `l'
In the first argument of `MyMathVal', namely `(l + r)'
In the expression: MyMathVal (l + r)
“c”也是如此。我想这是一个我看不到的愚蠢错误。你呢?
最佳答案
这解决了您在代码中解决的问题,但没有涵盖 bool 值。如果你想在数据声明中使用类约束,你可以像使用任何其他函数一样使用它:
data (Num a) => MyMath a = MyMath {x::a}
关于class - 如何定义像 "data MyMath = MyNum Num"这样的抽象数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10553519/
我想定义一个新的抽象数据类型,它可以是通用数字或除法结构。我将如何在 Haskell 中做到这一点? 我的第一个方法是: data MyMath = MyNum Num | D
我将使用什么内在函数来在 x86_64 上对以下内容进行矢量化(如果甚至可以进行矢量化)? double myNum = 0; for(int i=0;i __m128d sum = _mm_setz
我是一名优秀的程序员,十分优秀!