我正在为我的pipes库编写一个类型类来定义Proxy类似于抽象的接口.类型类看起来像:
class ProxyC p where
idT :: (Monad m) => b' -> p a' a b' b m r
(<-<) :: (Monad m)
=> (c' -> p b' b c' c m r)
-> (b' -> p a' a b' b m r)
-> (c' -> p a' a c' c m r)
... -- other methods
Run Code Online (Sandbox Code Playgroud)
我也在编写以下形式的扩展名Proxy:
instance (ProxyC p) => ProxyC (SomeExtension p) where ....
Run Code Online (Sandbox Code Playgroud)
......我想这些情况,以能够施加额外的约束,如果m是Monad则p a' …
我正在为管道接口中的某些编码包装C库,但我已经做了一些需要做出的设计决策.
在设置C库之后,我们保持编码器上下文.有了这个,我们可以编码,或者改变一些参数(让我们将Haskell接口调用到最后一个函数tune :: Context -> Int -> IO ()).我的问题分为两部分:
Pipe Foo Bar IO (),但我也想曝光tune.由于编码上下文的同时使用必须受到锁定保护,因此我需要在管道中的每次迭代时锁定,并tune使用相同的锁进行保护.但现在我觉得我正在强迫用户隐藏锁定.我在这里吠叫错了吗?这种情况通常如何在管道生态系统中得到解决?在我的情况下,我希望我的特定代码所属的管道始终在其自己的线程中运行,同时进行调整,但我不想强迫任何用户使用这种观点.管道生态系统中的其他软件包似乎也不会强迫用户使用.IO在管道被破坏时处理这些事情(在这种情况下执行som 动作)?一个具体的例子是包装压缩库,在这种情况下,上面可以是:
谢谢......这可能都很明显,但我对管道生态系统还很陌生.
编辑:发帖后阅读,我很确定这是我在这里问过的最模糊的问题.啊! 对不起;-)
什么是等效于以下存在量化字典的Pipe类型类,受类型的启发:
{-# LANGUAGE ExistentialQuantification, PolymorphicComponents #-}
data PipeD p = forall cat . PipeD {
isoI :: forall a b m r . Iso (->) (p a b m r) (cat m r a b),
categoryI :: forall m r . (Monad m) => CategoryI (cat m r) ,
monadI :: forall a b m . (Monad m) => MonadI (p a b m) ,
monadTransI :: forall a b . MonadTransI (p a b) }
Run Code Online (Sandbox Code Playgroud)
我想要的粗略想法是试图说,给定(PipeLike …
标题是一个轻微的笑话.
我今天刚刚发现,在ghc没有抱怨的情况下接受任何优化级别.我知道这-O2应该是最大的优化级别,并且-O3 这里有一个提议,但我只是好奇当你错误地指定更高的优化级别时会发生什么.是ghc默认-O2还是不优化?