我注意到Data.UnionFind使用IO monad通过IORefs提供指针.我想大家都很乐意unsafePerformIO在纯代码中本地使用它,因为数据结构很好理解,但是......
这种数据结构是否有规范的清洁方法?也许是IO的包装,unsafePerformIO通过禁止大多数IO操作,不可避免地"不安全""看"?
谁能解释为什么这两个都快乐地编译:
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 b和A c d定义a -> b和c …
我很好奇我应该如何改进Haskell例程的性能,该例程找到一个字符串的按字典顺序最小的循环旋转.
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时候最低可及早消除串一样,因为它有一些非常后来字母开头.它是否正确?
我有一个具有几种不同类型的内部循环链接的数据结构,从cycle命令的意义上讲它是无限的.是否有任何有趣的模块可以将这些结构折叠成使用索引的平面数据结构?
我感兴趣的序列化完整的数据结构,既通过Read和Show以及通过Data.Serialize或相似.
构建顺序索引显然有很好的功能,但基于内存地址哈希值的索引也可以正常工作.
二次编程库是否有任何Haskell绑定?
如果没有,我应该编写哪一个简化的绑定来假设我无法避免需要一个?是否有一个合理的规范优惠的开源库?
optimization haskell mathematical-optimization linear-programming
是否有任何棘手的Haskell练习列表以令人惊讶的方式使用monads?我最感兴趣的是简单的'弄清楚这行代码的作用'或'使用这个monad'类型问题免费执行此操作.
如何严格折叠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但这样做看似缺乏必要的严格性.
我很好奇如何优化这段代码:
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都应该只要其中任何一个被执行,但执行f和g应被延迟.
看来这种行为可以通过写:
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) Haskell或C++中是否有任何合理的Bloomier 过滤器实现?另一个问题揭示了java-bloomier-filter.
我可以从Data.BloomFilter开始实现一个,但我想先问一下.