什么时候使用"严格的通配符"在Haskell,它做了什么?

时间:2016-09-11 16:21:01

标签: haskell pattern-matching wildcard 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

我真的不明白&#34;严格的通配符&#34;工作以及为什么它对这个功能(或任何其他功能)有用。

1 个答案:

答案 0 :(得分:12)

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