1. ホーム
  2. list

[解決済み] リスト作成/連結のための構文

2022-02-27 14:42:13

質問

Haskellを始めてまだ2日目なのですが、以下の2つの関数定義の違いは何でしょうか?

Prelude> let swap (x1:x2:xs) = x2:x1:xs
Prelude> swap [1..5]
[2,1,3,4,5]
Prelude> let swap' (x1:x2:xs) = [x2] ++ [x1] ++ xs
Prelude> swap' [1..5]
[2,1,3,4,5]

つまり、x2:x1:xs は [x2] ++ [x1] ++ xs と何が違うのでしょうか? お願いします、そしてありがとうございます。

どのように解決するのですか?

タイプシグネチャを利用するとよいでしょう。

(:) :: a -> [a] -> [a]
(++) :: [a] -> [a] -> [a]

これらを調べるには :type (:):type (++) を ghci で使用します。

型名からわかるように、どちらもリストを生成するために使用されます。

: 演算子はリストを作成するために使用します (また、パターンマッチのためにリストを分解することもできます)。 リストを作るには [1,2,3] で構築するだけです。 1 : 2 : 3 : [] . の最初の要素は : はリストの先頭に追加する項目で、2 番目の要素はリスト(これも : で示される空リストと [] ).

は、その ++ 演算子はリストの連結です。 これは2つのリストを受け取って、それらを足し合わせます。 [1,2,3] ++ [4,5,6] は合法ですが 1 ++ [1,2,3] はありません。