++
は、リストデータ型のコンストラクタではなく、:
です。あなたは
:
は、リストの先頭に要素を追加し、コンストラクタで
data [a] = [] | a : [a]
として定義されているリストのデータ型と考えることができます。
(++) :: [a] -> [a] -> [a]
(++) [] ys = ys
(++) (x:xs) ys = x : xs ++ ys
として私たちは、私たちの身近なリストの挙動を模倣する
data List a = Empty | Cons a (List a)
などの当社独自のデータ型のリストを定義することができます。しかし、++
は(http://hackage.haskell.org/package/base-4.8.1.0/docs/src/GHC.Base.html#%2B%2Bここではドキュメントで定義された)の関数です。実際には、(Cons val)
をパターンとして使用できます。私はあなたにも、あなたがなまけ二つのリストを連結し、1にそれらを結ぶ延期するために使用できるので、
data CList a = Empty | Cons a (CList a) | Concat (CList a) (CList a)
のように、連結コンストラクタを持つタイプを定義することができます信じています。このようなデータ型では、Concat xs ys
の入力に対してパターンマッチングを行うことができますが、2つのリストの境界でのみ動作し、その真ん中では動作しません。
とにかく、私はまだ自分自身をHaskellのためにかなり新しいですが、私はこれがポイントであると思います。
コンストラクタでのみパターンマッチングできます。あなたが言うように、 '++'は関数です。 – Bergi
あなたの機能が何をしたいのかを詳しく説明できるなら、非常に役に立ちます。あなたが書いたコードはあまり意味をなさないと思われるので、わかりません。 – dfeuer
大きな質問! 89年に戻って、実際にelem x(_ ++ x:_)= Trueを可能にする言語を構築しました。 elem _ _ = False。私はそれを欠場する。 – pigworker