我是Haskell的新手,Iam尝试使用Set
使用一个名为union
的函数实现Lists
ADT。下面是代码:
import Data.List
data Set a = Set [a]
union' :: Set a -> Set a -> Set a
union' xs [] = xs
union' [] ys = ys
union' x:xs ys = | not $ x:xs `elem` ys = x:union' xs ys
| otherwise union xs ys
我认为在类型分配方面我在做一些非常错误的事情。在编译时显示如下错误
error: parse error on input `::'
union' :: Set a -> Set a -> Set a
请原谅我这种愚蠢的错误,但感谢任何帮助,谢谢
答案 0 :(得分:1)
如果没有用于检查的原始代码,我只能留下一个版本供您比较,并且您可能会发现导致解析错误的内容:' ::'。
import Data.List
data Set a = Set [a]
union' :: Eq a => Set a -> Set a -> Set a
union' (Set xs) (Set []) = Set xs
union' (Set []) (Set ys) = Set ys
union' (Set (x:xs)) (Set ys)
| not $ x `elem` ys = cons (Set [x]) (union' (Set xs) (Set ys))
| otherwise = union' (Set xs) (Set ys)
cons (Set xs) (Set ys) = Set (xs ++ ys)
instance Show a => Show (Set a) where
show (Set xs) = show xs
以下是我开始修改源代码时遇到的问题:
你不需要把' ='在守卫之前' |'
你需要等同的空间缩进以保护' |'
缺少' ='为第二个守卫表达。
称为union而不是union'
你需要你的数据类型构造函数' Set'对于每个模式匹配。 (或者用于解包Set构造函数的包装函数和传递两个列表的帮助函数。这样,你可能不需要自己制作缺点。我只是想到了。)
用于设置的缺点而不是(:)
还有一个展示实例,用于显示结合的结果'。
只要相信你的编译器,最终一切都会好起来的!祝好运!