2017-11-18 20 views
0

コードである私は、以下のLists .hereを使用してunionという名前一つの機能でSet ADTを実装しようとしハスケルとはIAMの初心者です:私はここにタイプの割り当てでひどく間違って何かをやっていると思いますエラー:haskellの `:: '入力で解析エラーが発生しましたか?

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 

。それは以下のようにエラーを見せてコンパイル中に私だけにあなたのためのバージョンを残すことができ、調べるために元のコードがなければ、あなたに

+0

完全なエラーメッセージは何ですか? – melpomene

+0

あなたの型宣言は 'union''(union prime)という関数のためのものですが、あなたの関数は' union'と呼ばれます - それは関連していないかもしれませんが、とにかくそれをクリーンアップしたいかもしれません。 –

+0

['notElem'](http://hackage.haskell.org/package/base-4.10.0.0/docs/Prelude.html#v:notElem)は、btwです。 – melpomene

答えて

1

ありがとう、

error: parse error on input `::' 
union' :: Set a -> Set a -> Set a 

は、このような愚かな過ちのための私を許しますが任意の助けいただければ幸いです比較して、 '::'の構文解析エラーを引き起こす何かを見つけるかもしれません。

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. 2番目のガード式に '='がありません。

    代わりに労働組合の組合と呼ばれる
  4. すべてのパターンマッチングのための設定 『」あなたはつもりです

  5. は、あなたのデータ型のコンストラクタを必要とします』。 (またはSetコンストラクタをアンパックするためのラッパー関数と、2つのリストを渡すヘルパー関数)このようにして、あなた自身の短所を作る必要はないかもしれません。 :)

  6. また、unionの結果を表示するためのSetのshowインスタンス。

最終的にコンパイラを信頼すれば、最終的にはすべてうまくいくはずです!がんばろう!

関連する問題