我正在查看一些Haskell源代码并遇到与!_
的模式匹配,代码在这里:http://hackage.haskell.org/package/base-4.9.0.0/docs/src/GHC.List.html#unsafeTake
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
我真的不明白&#34;严格的通配符&#34;工作以及为什么它对这个功能(或任何其他功能)有用。
答案 0 :(得分:12)
这个想法是unsafeTake
(和take
这个问题),当被要求返回空列表的第一个m
元素时,它应该返回空列表,无论是什么m
的价值是什么。但是如果m
是一个抛出异常的表达式呢?例如,unsafeTake undefined []
返回[]
会很奇怪。所以我们需要确保m
求值为整数,即使我们不关心它的确切值(当然对于空列表的情况)。这使得unsafeTake
在第一个参数时的行为方式相同,而不管第二个参数(列表)是否为空。