串联自定义列表包装器数据类型

时间:2019-11-12 04:31:32

标签: haskell

我具有以下数据类型。

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?任何帮助表示赞赏!

3 个答案:

答案 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]