12

Haskell のソース コードをいくつか見ていたところ、 とのパターン マッチが見つかり!_ました。コードは次のとおりです。

take n xs | 0 < n     = unsafeTake n xs
          | otherwise = []

-- A version of take that takes the whole list if it's given an argument less
-- than 1.
{-# NOINLINE [1] unsafeTake #-}
unsafeTake :: Int -> [a] -> [a]
unsafeTake !_  []     = []
unsafeTake 1   (x: _) = [x]
unsafeTake m   (x:xs) = x : unsafeTake (m - 1) xs

「厳密なワイルドカード」がどのように機能するのか、なぜこの関数 (または他の関数) に役立つのか、よくわかりません。

4

1 に答える 1

12

アイデアは、unsafeTake(さらに言えば)空のリストtakeの最初の要素を返すように求められた場合m、の値が何であれ、空のリストを返す必要があるということmです。しかしm、例外をスローする式の場合はどうなるでしょうか? たとえば、 がunsafeTake undefined []を返すのは変です[]。したがってm、正確な値が何であるかを気にしなくても、 が整数に評価されることを確認する必要があります (もちろん、空のリストの場合)。これによりunsafeTake、2 番目の引数 (リスト) が空かどうかに関係なく、最初の引数に関しては同じように動作します。

于 2016-09-11T16:25:37.617 に答える