如何解析出任何一种类型的具体值

时间:2016-03-06 06:15:50

标签: haskell

我有这样的数据结构:

var index = getIndex('one', skillsets, 'id');

现在我有这样的功能:

data MyType = Either Bool Int

我的目标是从myFunc :: MyType -> Int myFunc mt = Right mt 中获取Int值,但是当我尝试编译此函数时,我收到以下错误:

myType

我做错了什么?

2 个答案:

答案 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的构造函数,它带有BoolInt。所以你会有例如。

Either True 42 :: MyType

您想要的是能够使用新名称Either Bool Int引用现有类型MyType,即类型同义词。您可以使用type而不是data定义类型同义词,即

type MyType = Either Bool Int

这将产生

Left True :: MyType

Right 42 :: MyType