何时在Haskell中使用"严格通配符"是有用的,它有什么作用?

Car*_*s D 12 haskell wildcard pattern-matching strictness

我正在查看一些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
Run Code Online (Sandbox Code Playgroud)

我真的不明白"严格的通配符"是如何工作的以及为什么它对这个函数(或任何其他函数)有用.

red*_*neb 12

想法是unsafeTake(并且take就此而言),当被要求返回m空列表的第一个元素时,它应该返回空列表,无论值m是什么.但是,如果m是一个抛出异常的表达式呢?例如,unsafeTake undefined []返回会很奇怪[].因此,m即使我们不关心它的确切值,我们也需要确保求值为整数(当然,对于空列表情况).这使得unsafeTake它的第一个参数的行为方式相同,无论第二个参数(列表)是否为空.