最小限の変更を加えた作業バージョン、thx @Matt、Petr、Landei !!!
insert :: (Ord el) => el -> Menge el -> Menge el
insert a (Menge (x:xs)) = ins a (Menge (x:xs)) (Menge [])
ins a (Menge []) (Menge ys) = Menge (ys ++ [a])
ins a (Menge xs@(x:xs')) (Menge ys)
| a < x = Menge (ys ++ [a] ++ xs)
| a > x = ins a (Menge xs') (Menge (ys ++ [x]))
| otherwise = Menge (ys ++ xs)
独自の Datatype Menge を持ち、リストのように機能し、正しい位置に要素を挿入する必要があります...
module Menge (
Menge,
empty,
insert,
ins
) where
data Menge el = Menge [el] deriving (Eq)
instance (Show el) => Show (Menge el) where
show (Menge liste) = "{" ++ (elms liste) ++ "}"
where
elms :: (Show a) => [a] -> String
elms [] = ""
elms (x:[]) = show x
elms (x:xs) = show x ++ ", " ++ elms xs
empty :: Menge el
empty = Menge []
insert :: (Ord el) => el -> Menge el -> Menge el
--insert a (Menge []) = (Menge [a])
insert a (Menge (x:xs)) = ins a (Menge (x:xs)) (Menge [])
ins a (Menge []) (Menge (y:ys)) = (Menge ((y:ys) ++ [a]))
ins a (Menge (x:xs)) (Menge (y:ys))
| a < x = (Menge ((y:ys) ++ [a] ++ (x:xs)))
| a > x = ins a (Menge xs) (Menge ((y:ys) ++ [x]))
| a > x && xs == [] = error "same function as: ins a empty (Menge (y:ys))"
| a == x = (Menge ((y:ys) ++ (x:xs)))
| otherwise = error "blabla"
私は次のように入力します: insert 2 (Menge ([1,3]))
、私の意見では、次のように動作するはずです:
--> ins 2 (Menge (1:3)) empty --> 2 > 1 --> ins 2 (Menge [3]) (Menge [] ++ [1])
--> ins 2 (Menge [3]) (Menge [1]) --> 2 < 3 --> (Menge ([1] ++ [2] ++ [3])) --> [1,2,3]
しかし、代わりに次のように表示されます:「関数insの非網羅的なパターン」
と入力しても同じエラーが発生するins 2 (Menge ([1,3])) (Menge [])
ため、最初のステップが機能します。コンパイラは「空」/「(Menge [])」を好まないようです。入力すると、答えins 2 (Menge ([1,3])) (Menge [1,3])
が得{1, 3, 2}
られるためです。