相关疑难解决方法(0)

计算列表中满足给定谓词的元素数

Haskell标准库是否具有给定列表和谓词的函数,返回满足该谓词的元素数量?类似于类型的东西(a -> Bool) -> [a] -> Int.我的搜索没有回复任何有趣的东西.目前我正在使用length . filter pred,我发现这并不是一个特别优雅的解决方案.我的用例似乎很常见,有一个更好的库解决方案.是这种情况还是我的预感错了?

haskell functional-programming

39
推荐指数
3
解决办法
3万
查看次数

惯用效率高的Haskell追加?

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)

performance haskell linked-list append idiomatic

34
推荐指数
6
解决办法
1万
查看次数

在Haskell中查找列表的平均值

我认为我的代码可以找到列表(整数)的平均值,但是有问题.这是我的代码

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章的一个问题.)

recursion haskell

0
推荐指数
1
解决办法
1815
查看次数