错误:解析输入`::'在哈斯克尔?

时间:2017-11-18 14:29:48

标签: haskell functional-programming

我是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

请原谅我这种愚蠢的错误,但感谢任何帮助,谢谢

1 个答案:

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

以下是我开始修改源代码时遇到的问题:

  1. 你不需要把' ='在守卫之前' |'

  2. 你需要等同的空间缩进以保护' |'

  3. 缺少' ='为第二个守卫表达。

  4. 称为union而不是union'

  5. 你需要你的数据类型构造函数' Set'对于每个模式匹配。 (或者用于解包Set构造函数的包装函数和传递两个列表的帮助函数。这样,​​你可能不需要自己制作缺点。我只是想到了。)

  6. 用于设置的缺点而不是(:)

  7. 还有一个展示实例,用于显示结合的结果'。

  8. 只要相信你的编译器,最终一切都会好起来的!祝好运!