我最近问了一些有关TVar的问题,我仍然对livelock感到担忧。 所以我想到了这个结构: 每个事务都有一个唯一的优先级(可能是按创build顺序分配的)。 事务尝试获取对其访问的数据的读/写locking。 自然地,同时读取是可以的,但是一个写入locking排除所有其他(读取和写入)。 说事务A的优先级比事务B的优先级高。如果A持有锁,B等待,但是如果B持有锁并且A需要它,则B从锁中引导,A获得它,并且事务B重新启动(如同TVar ) 。 然而B保持当前优先重试。 当一个锁被释放并且等待事务时,它将进入最高优先级的事务,其余的继续等待。 我相信这个系统可以防止死锁,但也可以防止饥饿(与TVar不同)。 我想知道是否有人实施了这样一个系统,因为它似乎相当明显,我不想重新发明轮子。 当然,这样的方法很容易扩展到允许用户指定优先级。 优先级可以是pair (user_supplied_prio, auto_increment) , user_supplied_prio优先,但优先级相同的任务按FIFO顺序parsing。 评论/解决scheme: 实际上,当我想到这一点时,Haskell中已经存在,只需要使用一个IORef包装所有的数据,并且只使用atomicModifyIORef 。 atomicModifyIORef将确保交易按顺序应用。 但是,有人可能会认为这意味着数据结构是顺序的(即有效地限于一个线程),但实际上由于懒惰而是并行的。 为了解释这一点,考虑一个昂贵的函数f 。 我们打算把这个应用到一个Data.Map的关键字“foo”的数据。 用(foo -> future(fx))replace(foo -> x) (foo -> future(fx)) 。 这个线程将继续确定(fx)实际是什么,但同时我们可以将g应用到“bar”中。 由于将g应用于“bar”并不需要“foo”的结果,因此我们可以同时处理这个问题。 没有死锁,没有饥饿,最终所有交易将被处理(大致按照他们收到的顺序)。
我正在运行一个长期存在的Haskell程序。 运行+RTS -N5 -s -A25M (我的L3caching的大小)我看到: 715,584,711,208 bytes allocated in the heap 390,936,909,408 bytes copied during GC 4,731,021,848 bytes maximum residency (745 sample(s)) 76,081,048 bytes maximum slop 7146 MB total memory in use (0 MB lost due to fragmentation) Tot time (elapsed) Avg pause Max pause Gen 0 24103 colls, 24103 par 240.99s 104.44s 0.0043s […]
通过仔细检查文档 ,我了解到Emacs haskell-mode提供了三种不同的自动缩进方法。 它们被称为haskell-indentation , haskell-indent和haskell-simple-indent 。 任何人都可以解释这些方法是如何相似,他们是如何不同? 我不仅对个别特征感兴趣,而且对一个事实上的标准感兴趣,或者不再维护一个或两个标准。
我有一个Haskell项目和Cabal包描述,允许我build立和安装我的包 $ cabalconfiguration $ cabal构build $ cabal安装 但是cabal test呢? Cabal的帮助说用UserHooksconfiguration一个testing套件,但是我怎么做呢?
我试图将Haskell核心库的箭头翻译成F#(我认为这对于更好地理解箭头和F#是一个很好的练习,我可能可以在我正在进行的项目中使用它们)。但是,直接翻译由于范式的不同,是不可能的。 Haskell使用types类来expression这些东西,但是我不确定F#构造的最好用F#的习惯用法映射types类的function。 我有一些想法,但最好把它提出来,看看什么被认为是最接近的function。 对于人群:如何将types类(一个Haskell成语)翻译成F#惯用代码? 对于那些接受我长久解释的人来说: Haskell标准库中的代码就是我试图翻译的一个例子: class Category cat where id :: cat aa comp :: cat ab -> cat bc -> cat ac class Category a => Arrow a where arr :: (b -> c) -> abc first :: abc -> a (b,d) (c,d) instance Category (->) where id f = f instance Arrow […]
Haskell和其他函数式编程语言是围绕不维护状态而build立的。 我对于函数式编程的工作原理和概念还不熟悉,所以我想知道是否可以用FP方式实现DPalgorithm。 什么function的编程结构可以用来做到这一点?
Text Text.Parsec Text.Parsec.ByteString Text.Parsec.ByteString.Lazy Text.Parsec.Char Text.Parsec.Combinator Text.Parsec.Error Text.Parsec.Expr Text.Parsec.Language Text.Parsec.Perm Text.Parsec.Pos Text.Parsec.Prim Text.Parsec.String Text.Parsec.Token ParserCombinators Text.ParserCombinators.Parsec Text.ParserCombinators.Parsec.Char Text.ParserCombinators.Parsec.Combinator Text.ParserCombinators.Parsec.Error Text.ParserCombinators.Parsec.Expr Text.ParserCombinators.Parsec.Language Text.ParserCombinators.Parsec.Perm Text.ParserCombinators.Parsec.Pos Text.ParserCombinators.Parsec.Prim Text.ParserCombinators.Parsec.Token 他们是一样的吗?
我已经提到IO不符合单子法,但是我没有find一个简单的例子来表明这一点。 有人知道一个例子吗? 谢谢。 编辑:正如ertes和nm指出的,使用seq有点不合法,因为它可以使任何monad失败的法律(结合undefined )。 由于undefined可能被视为非终止计算,所以使用它是完全正确的。 所以修改后的问题是: 有人知道一个例子,说明IO不能满足单子法则,不使用seq ? (或者,如果seq不被允许,那么certificateIO确实符合法律?)
我对如何selectdata family和type family感到困惑。 TypeFamilies上的wiki页面进入了很多细节。 有时候,它非正式地将Haskell的data family称为散文中的“types家族”,但当然在Haskell中也有type family 。 有一个简单的例子,显示了两个版本的代码显示在哪里,不同的是data family还是type family正在声明: — BAD: f is too ambiguous, due to non-injectivity — type family F a — OK data family F af :: F a -> F a f = undefined g :: F Int -> F Int gx = fx type和data具有相同的含义,但type family版本不能进行types检查,而data family版本是好的,因为data family “创build新types,因此是内射的”(维基页面)。 […]
我已经把IO monad描述为一个国家单体,国家是“真实的世界”。 这种IO方法的支持者认为,这使得IO操作是纯粹的,就像在透明中一样。 这是为什么? 从我的angular度来看,IO monad中的代码有很多可观察到的副作用。 另外,难道不可能像真实世界的函数那样描述任何非纯粹的function吗? 例如,我们不能把C的malloc看作是一个函数,它需要一个RealWorld和一个Int,并且返回一个指针和一个RealWorld ,就像RealWorld隐含的IO monad一样。 注意:我知道monad是什么,以及它是如何使用的。 请不要回应一个随机monad教程的链接,除非它特别强调我的问题。