您好我正在尝试在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))
有人能指出我正确的方向吗?
谢谢!
答案 0 :(得分:2)
查看最后一行:
u n = FL [t]:(u (n-1))
你的类型为Int -> FieldList
。 n
是Int
,因此(n - 1)
也是Int
。 u (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)
您的代码存在两个问题:
(:)
的第一个参数是一个元素,而不是一个列表,因此:t : ...
不是[t] : ...
FieldList
以获取[Field]
。然后,您可以将t
添加到其中。你希望你的最后一行是
u n = case u (n-1) of FL xx -> FL (t:xx)
如果字段列表是Name
,那当然无法模式匹配,所以我同意Ankur的设计可能存在问题......