0

Haskell Road to LogicからHaskellを学ぼうとしています が、この例に出くわしました。

    mnmInt :: [Int] -> Int
    mnmInt [] = error "empty list"·
    mnmInt [x] = x
    mnmInt (x:xs) = min x (mnmInt xs)

関数が次のリストを取得することを理解していますInt-空の場合はチェックし、そうでない場合は1 intのリストであるかどうかをチェックし、そうでない場合はxを返します。

どのようにしてベースケースに到達しますか?xsは何の略ですか?

最小の実装:

   min' :: Int -> Int -> Int
   min' x y | x <= y    = x
            | otherwise = y

配列を取りません。

4

2 に答える 2

5

(x:xs)はパターン マッチング構文です。パターン マッチングを使用すると、データ型を「分解」して名前にバインドできます。この場合、x がリストの先頭で、xs が末尾です。min'x はリスト自体ではなくリストの先頭であるため、リストを取得する必要はありません。

min'のようなリストを渡すと、それ自体が 2 つの間の最小値を見つけ、Ints最終mnmInt的に次のように展開されます。(min' 1 (min' 2 (min' 3 4)))[1,2,3,4]

これは、コードを手で評価すると簡単に確認できるので、試してみることを強くお勧めします。(x:xs)リストの先頭と末尾にある 2 つの名前を覚えておいてください。を使用してリストの構築をいじってみるとよいでしょう。:

パターン マッチングがコード フローにどのように関係するかを示す例を次に示します。

foo (x:y:[]) = "two"
foo ([]) = "none"
foo (_) = "some other value"

呼び出すfoo [1,2]と「2」が出力され、実行foo [1,2,3]すると「他の値」が返され、実行foo []すると返されます"none"

于 2012-05-15T22:27:53.523 に答える
1

Haskell では 2 つの方法でリストを書くことができます。まず [1,2,3,4,5] のように、これは 1:2:3:4:5:[] のシンタックス シュガーにすぎません。パターン (x:xs) は、次のようなリストと一致します。

    head(x:xs) = x
    --> head [1,2,3,4,5] = head 1:2:3:4:5:[] = head 1:xs = 1

この例で、リスト パターンがどのように機能するかが明確になることを願っています。

于 2012-05-16T10:03:07.657 に答える