我在这里寻找一些词汇.有许多形状具有通用名称.例如,L a = Empty | Cons a L
通常称为"列表",而T a = Leaf a | Node (T a) (T a)
"二叉树" St s a :: St (s->(a,s))
则是状态Monad的形式.
我想知道这样的形状是否有一个名字:
data R a b = Q (a -> (R a b,b))
Run Code Online (Sandbox Code Playgroud)
我在Arrow框架和State Machine实现中看到了这种模式.递归函数使它感觉有点像State Monad或Cont Monad.这也是除了唯一的结构(->)
和(>=>)
为我所见过定义箭头的实例.
这个数据结构有一个共同的名称吗?
不久之前,我遇到了一篇关于FingerTrees的文章(另见附带的Stack Overflow问题),并提出了这个想法.我终于找到了使用它们的理由.
我的问题是,Data.FingerTree软件包似乎在边缘有点腐烂.此外,Containers包中的Data.Sequence使用数据结构重新实现(可能更好)版本,但不导出它.
由于理论上这个结构似乎很有用,但它似乎没有得到很多实际使用或关注.有人发现FingerTrees作为一个实际问题没有用处,或者这是一个不够关注的案例?
进一步说明:
我有兴趣构建一个包含具有良好串联属性的文本的数据结构.考虑从各种片段构建HTML文档.大多数预构建的解决方案使用字节串,但我真的想要正确处理Unicode文本的东西.我的计划是将Data.Text片段分层到FingerTree中.
我还想借用Data.Vector借用切片而无需使用(偏移,长度)操作进行复制.Data.Text.Text内置于数据类型,但仅用于高效的uncons和unsnoc opperations.在FingerTree中,这些信息很容易成为v
树的注释或注释.
我有两个MVar(好吧是一个MVar和一个Chan).我需要从Chan中取出并处理它们,直到另一个MVar不再为空.我理想的解决方案就像UNIX select
函数,我传入一个(可能是空的)MVar列表和线程块直到其中一个已满,然后它返回完整的MVar.尽量尝试我可以想到除了用isEmptyMVar重复轮询每个MVar之前没办法做到这一点,直到我弄错.这似乎效率低下.
一个不同的想法是使用throwTo,但它会中断线程中发生的事情,我需要以原子方式完成处理Chan的工作.
我正在打字的最后一个想法是为每个MVar创建一个新的forkIO,它试图读取它的MVar然后用自己的实例填充一个新创建的MVar.然后原始线程可以阻止该MVar.Haskell线程是否足够便宜,可以运行那么多?
我正在搞乱,HashMap
并试图用Data.Bson.ObjectId
一把钥匙.当然,我发现Hashable
该结构没有实例.没关系,因为写一个是微不足道的.1
instance Hashable ObjectId where hash (Oid x y) = hash (x,y)
Run Code Online (Sandbox Code Playgroud)
我将该行键入GHCi并被告知"输入`实例'上的解析错误".这实际上是有意义的,因为GHCi提示操作就好像在IO monad中将行键入到do块中,并且在此上下文中无法定义实例.
那么我的问题是,有没有办法在GHCi中定义一个新实例?
1为什么库不提供此实例是另一回事.我相信答案是限制依赖性,除了bson包已经依赖于太阳下的一切.
所有解析器Text.Parsec.Token
礼貌地用于lexeme
在令牌之后吃空格.对我来说不幸的是,空格包括新行,我想将它用作表达式终止符.有没有办法说服lexeme
新线?
我一直在使用Haskell的STM库,我非常喜欢编写事务的能力以及STM的一般"你不能得到这个错误"的特性.
有充分理由,STM不允许在事务中执行IO操作.无法重试IO操作.(在这里插入发射导弹参考).另一方面,数据库事务确实有一些非常相似的原子性保证.有没有可以接受的方式将两者结合使用?
上下文:这个问题具体参考Control.Lens
(撰写本文时的版本3.9.1)
我一直在使用镜头库,能够读取和写入结构的一块(或遍历的碎片)是非常好的.然后我讨论了是否可以使用镜头来对抗外部数据库.当然,我需要在执行中执行IO Monad
.所以概括:
题:
鉴于一个吸气剂(s -> m a)
和一个定位器(b -> s -> m t)
在哪里m
是Monad,是否可以构造Lens s t a b
镜头的Functor现在也包含在Monad中?是否仍然可以(.)
与其他"纯功能"镜头组合使用?
例:
我可以让Lens (MVar a) (MVar b) a b
使用readMVar
和withMVar
?
替代方案:
对于IO
monad中的容器是否有等效的Control.Lens,如MVar
或IORef
(或STDIN
)?
Haskell wiki网站上有两个函数:
功能1
fib = (map fib' [0 ..] !!)
where
fib' 0 = 0
fib' 1 = 1
fib' n = fib (n - 1) + fib (n - 2)
Run Code Online (Sandbox Code Playgroud)
功能2
fib x = map fib' [0 ..] !! x
where
fib' 0 = 0
fib' 1 = 1
fib' n = fib (n - 1) + fib (n - 2)
Run Code Online (Sandbox Code Playgroud)
什么是"!!" 意思?
haskell ×9
android ×1
concurrency ×1
database ×1
finger-tree ×1
ghc ×1
ghci ×1
haskell-lens ×1
monads ×1
parsec ×1
stm ×1
terminology ×1
typeclass ×1
types ×1