在Haskell中定义数据类型

时间:2010-12-01 17:07:03

标签: haskell types

问候,我是Haskell的新手,我已经陷入了为作业定义数据类型的困境。

我需要创建“策略”类型,它基本上是一个包含1-6个字符的字符串,每个字符代表一个数字值,我必须将大于9的值表示为一个字母(最多35个不同的值),我试过了定义一个表示每个可能值的辅助类型,并使用它来创建我的类型,但我的代码不起作用,我已经没有想法了。这是我一直在尝试的定义:

data Value = '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | 'A' | 'B' |
 'C' | 'D' | 'E' | 'F' | 'G' | 'I' |'J' | 'K' | 'L' | 'M' |  'N' | 'O' | 'P' |
 'Q' |'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'Y' | 'X' | 'Z'

data Strategy = Value | Value:Value | Value:Value:Value |
Value:Value:Value:Value | Value:Value:Value:Value:Value |             
Value:Value:Value:Value:Value:Value

值类型不接受数字,策略类型“排序”一直到第二个构造函数,然后它就会破灭。谢谢你的帮助!

2 个答案:

答案 0 :(得分:6)

就像您之前(已删除)的问题一样,这看起来很像家庭作业。如果您选择真实姓名而不使用此丢弃帐户,这也会有所帮助。

This page告诉您如何使用haskell的data类型声明。你在做什么不同/错?

  1. 您为Value使用字符而不是构造函数。 '1' '2'等都是字符,您需要一个构造函数以及零个或多个字段,如ValueCon1 CharValueCon2 String

  2. 您正在使用列表构造函数,我假设的是Value的字段,而不是为Strategy定义任何新的构造函数。也许你想要data Strategy = Strat [Value],它会接受任何大小的列表。虽然更痛苦,但您可以定义许多具有有限数量的单独Value字段的策略构造函数。

  3. 顺便说一下 - 你的课程在哪里教?这个术语似乎很晚才能涵盖这些基础知识。

答案 1 :(得分:1)

type Strategy = [Char]

^^我实际上是怎么做的。

或者,也许

newtype Strategy = Strategy [Char]

这不太原则,因为你有义务不填写废话。使用newtype解决方案,您可以使用“智能构造函数”并说,例如

mkStrategy :: [Char] -> Strategy
mkStrategy x
   | {- list is valid -} = Strategy x
   | otherwise = error "you gave me a bad strategy!"

在实际代码中,你不想抛出错误,但返回一个选项类型,但这是另一个故事......