小编Jef*_*ges的帖子

GHC真的不会内联地图,扫描,折叠等吗?

我注意到GHC手册说"对于自递归函数,环路断路器只能是函数本身,因此INLINE编译指示总是被忽略."

这难道不是说像普通的递归功能结构的每一个应用程序map,zip,scan*,fold*,sum,等不能被内联?

您可以随时重写所有这些功能,添加适当的严格标签,或者使用像这里推荐的"流融合"这样的花哨技术.

然而,这并不是所有这些都极大地限制了我们编写同时快速和优雅的代码的能力吗?

optimization haskell inline ghc

27
推荐指数
2
解决办法
2103
查看次数

在纯代码中避免使用IORef

我注意到Data.UnionFind使用IO monad通过IORefs提供指针.我想大家都很乐意unsafePerformIO在纯代码中本地使用它,因为数据结构很好理解,但是......

这种数据结构是否有规范的清洁方法?也许是IO的包装,unsafePerformIO通过禁止大多数IO操作,不可避免地"不安全""看"?

monads haskell data-structures union-find ioref

25
推荐指数
1
解决办法
846
查看次数

为什么不在Haskell中输入同义词允许递归?

谁能解释为什么这两个都快乐地编译:

data A a b = A { a :: a, b :: b }
newtype B a = B (A a (B a))
newtype C = C (A Int C)
Run Code Online (Sandbox Code Playgroud)

但我不能通过类型同义词创建类似的递归定义类型?

type B a = A a (B a)
type C = A Int C
Run Code Online (Sandbox Code Playgroud)

虽然显然data B a = A { a :: a, b :: B a }效果很好.

有没有办法避免处理那个额外的构造函数X,我希望类型递归?我主要传递的是访问器功能,b无论如何都要选择,所以我很好,但如果存在简单的规避机制,我想知道它.

我应该用什么编译指示来提高专用数据类型C的性能?只是专攻东西?

在没有复制记录两次的情况下复制A a bA c d定义a -> bc …

haskell types

20
推荐指数
2
解决办法
1255
查看次数

哈斯克尔的"++"多么懒惰?

我很好奇我应该如何改进Has​​kell例程的性能,该例程找到一个字符串的按字典顺序最小的循环旋转.

import Data.List
swapAt n = f . splitAt n where f (a,b) = b++a
minimumrotation x = minimum $ map (\i -> swapAt i x) $ elemIndices (minimum x) x
Run Code Online (Sandbox Code Playgroud)

我想我应该使用Data.Vector而不是列表,因为Data.Vector提供了就地操作,可能只是将一些索引操作到原始数据中.我自己实际上不需要费心去追踪索引以避免过多的复制,对吗?

我很好奇,++但优化的影响如何.我想它会产生一个懒惰的字符串thunk,直到字符串被读取到远处才会附加.因此,这个a应该实际上从未被追加到b时候最低可及早消除串一样,因为它有一些非常后来字母开头.它是否正确?

string optimization haskell lazy-evaluation

14
推荐指数
2
解决办法
495
查看次数

在Haskell解开结的任何好工具?

我有一个具有几种不同类型的内部循环链接的数据结构,从cycle命令的意义上讲它是无限的.是否有任何有趣的模块可以将这些结构折叠成使用索引的平面数据结构?

我感兴趣的序列化完整的数据结构,既通过ReadShow以及通过Data.Serialize或相似.

构建顺序索引显然有很好的功能,但基于内存地址哈希值的索引也可以正常工作.

haskell circular-reference

14
推荐指数
2
解决办法
1121
查看次数

Haskell中的二次编程

二次编程库是否有任何Haskell绑定?

如果没有,我应该编写哪一个简化的绑定来假设我无法避免需要一个?是否有一个合理的规范优惠的开源库?

optimization haskell mathematical-optimization linear-programming

13
推荐指数
1
解决办法
974
查看次数

有人看过一些棘手的Haskell练习列表吗?

是否有任何棘手的Haskell练习列表以令人惊讶的方式使用monads?我最感兴趣的是简单的'弄清楚这行代码的作用'或'使用这个monad'类型问题免费执行此操作.

monads haskell

11
推荐指数
3
解决办法
2400
查看次数

Haskell有折叠吗?

如何严格折叠monad? Data.Foldable有严格foldl'和一元foldlM,但没有严格foldlM'?严格是由monad本身定义的吗?如果是这样,一个人如何解决它是什么?

想象一下,我必须确定一个巨大的环元素列表的产品是否为零,但我的环不是一个完整的域,即它包含零设计.在这种情况下,我应该递归地在列表上递归foldl我的乘法***,但返回False产品变为零的时刻,而不是等待完整的产品.

safelist :: [p] -> Bool
safelist [] = True
safelist (x:xs) = snd $ foldl' f (x,True) xs
   where  f (u,b) v = (w, b && w /= Zero)  where  w = u *** v
Run Code Online (Sandbox Code Playgroud)

我也许可以使用Maybemonad来略微简化这段代码,foldlM但这样做看似缺乏必要的严格性.

monads haskell fold

9
推荐指数
1
解决办法
2231
查看次数

优化Haskell中的部分计算

我很好奇如何优化这段代码:

fun n = (sum l, f $ f0 l, g $ g0 l)
  where l = map h [1..n]
Run Code Online (Sandbox Code Playgroud)

假设f,f0,g,g0,和h都是昂贵的,但创建和存储l是非常昂贵的.

如上所述,l存储直到返回的元组被完全评估或垃圾收集.取而代之的是,length l,f0 l,和g0 l都应该只要其中任何一个被执行,但执行fg应被延迟.

看来这种行为可以通过写:

fun n = a `seq` b `seq` c `seq` (a, f b, g c)
  where
    l = map h [1..n]
    a = sum l
    b = inline f0 $ l …
Run Code Online (Sandbox Code Playgroud)

optimization haskell ghc

8
推荐指数
1
解决办法
342
查看次数

是否有适用于Bloomier过滤器的标准库?

Haskell或C++中是否有任何合理的Bloomier 过滤器实现?另一个问题揭示了java-bloomier-filter.

我可以从Data.BloomFilter开始实现一个,但我想先问一下.

c++ haskell

7
推荐指数
1
解决办法
191
查看次数