小编sch*_*kin的帖子

堆叠ResourceT monad变换器

我想堆ResourceTReaderT单子.看来我有两个选择:放在ReaderT堆栈的底部或顶部.

data MyEnv

newtype MyT1 m a = MyT1 { unT1 :: ResourceT (ReaderT MyEnv m) a }

newtype MyT2 m a = MyT2 { unT2 :: ReaderT MyEnv (ResourceT m) a }
Run Code Online (Sandbox Code Playgroud)

在性能/正确性方面哪些更好?什么是堆叠的一般准则ResourceTWriterT或其他单子?

haskell monad-transformers

11
推荐指数
1
解决办法
194
查看次数

Haskell是否自动执行SIMD优化?

可以使用https://hackage.haskell.org/package/ghc-prim-0.4.0.0/docs/GHC-Prim.html#g:28在Haskell中编写基于SIMD的矢量库,但它是否有意义?我在Haskell中发现了几篇致力于自动SIMD优化的论文,但目前的状况是什么(2014年)?例如,https: //hackage.haskell.org/package/vector是否使用SIMD,或者最好使用低级SIMD原语手动编写优化库?

haskell simd

8
推荐指数
2
解决办法
1033
查看次数

MonadResource中的资源释放顺序

MonadResource能够跟踪多个资源.有时这些资源的解除分配顺序很重要.考虑以下代码:

allocator1 = putStrLn "allocator1"
deallocator1 = putStrLn "deallocator1"

allocator2 = putStrLn "allocator2"
deallocator2 = putStrLn "deallocator2"

accessResource = const $ putStrLn "accessResource"

resourceTest :: MonadResource m => m ()
resourceTest = do
    (_, resource1) <- allocate allocator1 $ const deallocator1
    (_, resource2) <- allocate allocator2 $ const $ accessResource resource1 >> deallocator2
    return ()

main = runResourceT resourceTest 
Run Code Online (Sandbox Code Playgroud)

这里我从resource2清理操作访问resource1,所以我希望resource1将始终在resource1之后被释放,否则代码将是不正确的.至少在目前的实施中这是事实.如果我运行代码,我会得到:

allocator1
allocator2
accessResource
deallocator2
deallocator1
Run Code Online (Sandbox Code Playgroud)

是否MonadResource始终隔离先前分配的资源(因此可以从以后的清理操作中访问)将在以后取消分配,或者解除分配顺序是特定于实现的?如果具体实施,保证特定解除分配顺序的最佳方法是什么?

haskell monad-transformers

5
推荐指数
1
解决办法
75
查看次数

使用PolyKinds和类型系列时有种歧义

我有两个类型系列,其中一个类型映射一种类型到另一种类型的不同类型和多态函数:

{-# LANGUAGE PolyKinds, TypeFamilies, FlexibleContexts, ScopedTypeVariables #-} 

type family F (a :: k1) :: k2
type family G (a :: k2) :: *

f :: forall k1 k2 (a :: k1) (p :: k1 -> *) . p (a :: k1) -> G (F (a :: k1) :: k2)
f = undefined
Run Code Online (Sandbox Code Playgroud)

此代码没有检查以下错误消息:

• Couldn't match type ‘G k20 (F k20 k1 a)’ with ‘G k2 (F k2 k1 a)’
  Expected type: p a -> G k2 (F k2 …
Run Code Online (Sandbox Code Playgroud)

haskell type-families polykinds

5
推荐指数
1
解决办法
84
查看次数

Haskell中的无限(最终周期性)HList

假设我有一个无限的动作序列,每个动作都返回某种类型的结果.就像是:

newtype Stream a = Stream (IO (a, Stream a))
Run Code Online (Sandbox Code Playgroud)

但随着a时间的推移不同.我想强烈输入这个序列.它显然没有任意无限类型序列和天真的方法,因此:

data HStream :: [u] -> * where Cons :: Proxy x -> HStream xs -> HStream (x ': xs)

infiniteInt = Cons (Proxy :: Proxy Int) infiniteInt
Run Code Online (Sandbox Code Playgroud)

将导致无限类型,Haskell的类型系统不支持.但是我没有看到最终周期性的HLists没有任何问题(即,从某些角度来看,哪种类型的序列会重复:)[Bool, Int, Int, Sting, Int, Sting, Int, Sting ... ].我还认为,如果我们有一些强烈规范化的方式来描述无限类型或某种方式来提供无限类型相等的证据,可以在有限数量的步骤中进行检查,那么应该可以用这种无限类型来检查程序.

有谁知道如何在Haskell中表示和使用这些类型?现在让我们从无限的最终周期性hlist开始,但是如果有人知道如何将它推广到更广泛的无限类型以及泛化限制的范围,我也会感激.

haskell types hlist dependent-type

2
推荐指数
1
解决办法
93
查看次数