haskellのisPrefixOfについて


Haskell では `[1,2,3]` は `1:2:3:[]` の糖衣構文だと学びました。

[code]

    import Data.List
    isPrefixOf (1:[]) (1:2:3:[])
    -- True
    
[/code]

ですが厳密には`1:[]`はprefixになっていないと思えます。  
`1:[]:2:3:[]` であれば確かにprefixと言えそうですがこれは`[1:2:3]`を解釈したものではないということをどう考えるべきですか？  
実装か関数の説明、のリストの糖衣構文のどれかが正確ではないと思うのですが。




注意：元の質問が第三者により大幅に「編集」されており、この解答は現在の質問の答とは言い難くなっています。元の質問には二つの疑問がありました:

  * 糖衣構文と文字展開の違いに関する誤解による疑問
  * `isPrefixOf` の prefix を「リストがリストに含まれている」と解説している文章（出展不明）に対する疑問

もっともな質問であり解答に値する質問だと思います。

* * *

糖衣構文は C言語のマクロのような式の文字列どおりの置換ではなく、式の構造を壊さないように適宜括弧を補って考える必要があります。

[code]

    isPrefixOf [1] [1,2,3]
    
[/code]

を文字通り `isPrefixOf 1:[] 1:2:3:[]` と展開するのは間違いです。正しくは括弧を補った次の式、

[code]

    isPrefixOf (1:[]) (1:2:3:[])
    
[/code]

と等価です。

`isPrefixOf`
は第一引数のリスト要素を先頭から見ていって、第二引数のリストの先頭から同じ順に現れるかどうかを調べる関数です。第二引数のリスト構造内に「同じリストが含まれている」ことを調べるものではありません。「含まれている」がどのような意味を持つのか不明ですが、あまり正確ではない解説で誤解されるのもしようがないのではないかという気がします。

どちらかというと、その説明は `isSuffixOf` の方に適しているかもしれません:

[code]

    isSuffixOf [3,4] [1,2,3,4]
    
[/code]

は `True` になりますが、糖衣構文を展開した式、

[code]

    isSuffixOf (3:4:[]) (1:2:3:4:[])
    
[/code]

をご覧になると、第一引数のリスト構造が第二引数の構造内に含まれているのがわかります。

