12

我正在查看一些 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

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

4

1 回答 1

12

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

于 2016-09-11T16:25:37.617 回答