我具有以下数据类型。
data NestedList a = Elem a | List [NestedList a]
不幸的是,创建这种数据类型的样本非常麻烦。
List [Elem 5, Elem 6, Elem 7, List [Elem 8, Elem 9, Elem 10]]
我想创建一个辅助器fromList
,该辅助器将采用任何类型的平面数组,并返回一个NestedList,该列表也为平面,但包含相同的数据。因此,我可以通过以下方式使用帮助程序制作上面的示例(不包括开始嵌套的部分):
fromList [5, 6, 7] == List [Elem 5, Elem 6, Elem 7]
这是我到目前为止所拥有的。
fromList :: [a] -> NestedList a
fromList [] = List[]
fromList [a] = Elem a
fromList (x:xs) = List [Elem x] ++ List [fromList xs]
错误消息是:
• Couldn't match expected type ‘[a0]’ with actual type ‘NestedList a’
• In the first argument of ‘(++)’, namely ‘List [Elem x]’
• Couldn't match expected type ‘NestedList a’ with actual type ‘[a0]’
• In the expression: List [Elem x] ++ List [fromList xs]
我不确定为什么它告诉我我没有返回NestedList
。我猜Haskell不知道如何本地连接我的新类型NestedList
?任何帮助表示赞赏!
答案 0 :(得分:6)
++仅为[a]定义。您可以:
fromList :: [a] -> NestedList a
fromList [a] = Elem a
fromList x = List $ fmap Elem x
尽管我不知道为什么您只需要一个元素列表的特殊情况。
答案 1 :(得分:4)
您已经使用方程式很好地指定了所需的条件
fromList [5, 6, 7] == List [Elem 5, Elem 6, Elem 7]
如果我们只是抽象
fromList xs = List (xs but with Elem applied to each element)
即
fromList xs = List (map Elem xs)
答案 2 :(得分:3)
您只能在常规的Haskell列表上使用++
,而不能在您制作的自定义商品上使用。代替List [Elem x] ++ List [fromList xs]
,执行List ([Elem x] ++ [fromList xs])
。或者,由于这只是两个元素,请将其简化为List [Elem x, fromList xs]
。