Haskell初学者:数据转换。错误

时间:2011-10-28 12:02:48

标签: haskell

您好我正在尝试在Haskell中编写一个非常简单的函数。但是我不能让“ghci”接受我的代码。

data Field = A1 Int deriving (Show)

data FieldList = FL [Field] | Name String deriving (Show)

t :: Field

t = A1 1

u :: Int -> FieldList

u 0 = FL []

u n = FL [t]:(u (n-1))

我得到的错误是:

test.hs:9:7:

Couldn't match expected type `FieldList' with actual type `[a0]'

    In the expression: (FL [t]) : (u (n - 1))
    In an equation for `u': u n = (FL [t]) : (u (n - 1))

有人能指出我正确的方向吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

查看最后一行:

u n = FL [t]:(u (n-1))

你的类型为Int -> FieldListnInt,因此(n - 1)也是Intu (n-1)因此会FieldList

函数应用程序的优先级高于运算符,因此上面的行等同于:

u n = (FL [t]) : (u (n - 1) )

FL [t]FieldList

但是,(:)的类型为a -> [a] -> [a]。您可以看到类型不匹配,这就是造成问题的原因。


您可能要做的是建立Field的列表(类型为[Field]),然后将其转换为FieldList。这是一些存根代码:

u :: Int -> FieldList
u n = FL (uHelper n)

uHelper :: Int -> [Field]
uHelper = ... -- write this function

答案 1 :(得分:1)

错误显示(FL [t]) : (u (n - 1))表示您正在尝试使用List cons功能 FL [t]这不是一个列表,因此您无法cons使用它。

我不确定为什么你创建了一个FieldList作为一种新的数据类型,它允许FieldList是一个字段列表或一个字符串(使用Name构造函数创建)哪种不是具有逻辑意义。

你可以做的是将FieldList设为:

type FieldList = [Field]

然后你的功能将成为:

u :: Int -> FieldList
u 0 = []
u n = t : (u (n-1))

答案 2 :(得分:0)

您的代码存在两个问题:

  1. list cons (:)的第一个参数是一个元素,而不是一个列表,因此:t : ...不是[t] : ...
  2. 您必须先打开FieldList以获取[Field]。然后,您可以将t添加到其中。
  3. 你希望你的最后一行是

    u n = case u (n-1) of FL xx -> FL (t:xx)
    

    如果字段列表是Name,那当然无法模式匹配,所以我同意Ankur的设计可能存在问题......