我有这样的数据结构:
var index = getIndex('one', skillsets, 'id');
现在我有这样的功能:
data MyType = Either Bool Int
我的目标是从myFunc :: MyType -> Int
myFunc mt = Right mt
中获取Int
值,但是当我尝试编译此函数时,我收到以下错误:
myType
我做错了什么?
答案 0 :(得分:3)
首先请注意,data
定义是Cactus和Daniel提到的 - 现在我假设你想要
type MyType = Either Bool Int
如果您真的想要data MyType = Either Bool Int
那么情况与我在data MyType = MyType ...
作为Either Bool Int
可以包含Bool
值(例如Left True
)或 Int
值(例如{{1}你的选择基本上是要么写一个部分函数:
Right 42
或者你写一个总数为bool案例的默认值:
myFunc :: MyType -> Int
myFunc (Right number) = number
myFunc (Left _) = error "oho ... there is no number"
或者您更改结果类型以反映无法获取某些数字(使用myFunc :: MyType -> Int
myFunc (Right number) = number
myFunc (Left True) = 1
myFunc (Left False) = 2
):
Maybe
当然也许您确实想要一个两者 myFunc :: MyType -> Maybe Int
myFunc (Right number) = Just number
myFunc (Left _) = Nothing
和Bool
部分的类型 - 在这种情况下,将您的类型更改为:
Int
并写
data MyType = MyType Bool Int
答案 1 :(得分:0)
data MyType = Either Bool Int
不意味着您的想法。这将创建一个名为MyType
的新代数数据类型,其中包含一个名为Either
的构造函数,它带有Bool
和Int
。所以你会有例如。
Either True 42 :: MyType
您想要的是能够使用新名称Either Bool Int
引用现有类型MyType
,即类型同义词。您可以使用type
而不是data
定义类型同义词,即
type MyType = Either Bool Int
这将产生
Left True :: MyType
和
Right 42 :: MyType