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它的第一个参数的行为方式相同,无论第二个参数(列表)是否为空.
| 归档时间: |
|
| 查看次数: |
291 次 |
| 最近记录: |