Haskell标准库是否具有给定列表和谓词的函数,返回满足该谓词的元素数量?类似于类型的东西(a -> Bool) -> [a] -> Int.我的搜索没有回复任何有趣的东西.目前我正在使用length . filter pred,我发现这并不是一个特别优雅的解决方案.我的用例似乎很常见,有一个更好的库解决方案.是这种情况还是我的预感错了?
List和cons运算符(:)在Haskell中非常常见.缺点是我们的朋友.但有时我想添加到列表的末尾.
xs `append` x = xs ++ [x]
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这不是实施它的有效方式.
我在Haskell中写了Pascal的三角形,但我不得不使用++ [x]反成语:
ptri = [1] : mkptri ptri
mkptri (row:rows) = newRow : mkptri rows
where newRow = zipWith (+) row (0:row) ++ [1]
Run Code Online (Sandbox Code Playgroud)
imho,这是一个可爱的可读Pascal的三角形和所有,但反成语让我烦恼.有人可以向我解释(并且,理想情况下,指向一个很好的教程)关于您想要有效追加到最后的情况下的惯用数据结构吗?我希望这个数据结构及其方法具有近似列表般的美感.或者,或者,向我解释为什么这种反成语对于这种情况实际上并不坏(如果你认为是这种情况).
[编辑]我最喜欢的答案是Data.Sequence,它确实具有"近似列表般的美丽".不确定我对操作所要求的严格程度.随时欢迎进一步的建议和不同的想法.
import Data.Sequence ((|>), (<|), zipWith, singleton)
import Prelude hiding (zipWith)
ptri = singleton 1 : mkptri ptri
mkptri (seq:seqs) = newRow : mkptri seqs
where newRow = zipWith (+) seq (0 <| seq) |> 1 …Run Code Online (Sandbox Code Playgroud) 我认为我的代码可以找到列表(整数)的平均值,但是有问题.这是我的代码
listlen xs = if null xs
then 0
else 1 + (listlen (tail xs))
sumx xs = if null xs
then 0
else (head xs) + sumx (tail xs)
mean xs = if null xs
then 0
else (fromIntegral (sumx xs)) / (fromIntegral (listlen xs))
Run Code Online (Sandbox Code Playgroud)
我的平均功能必须经过两次列表.一旦得到元素的总和,一旦得到元素的数量.显然这不是很好.
我想知道一种更有效的方法(使用基本的Haskell - 这是来自Real World Haskell第3章的一个问题.)