我正在使用重载方法记录Scala类.在scaladoc注释中引用它们时如何区分它们?例如,如果我有
/**
* The most important method is [[Doc.foo]].
*/
object Doc {
def foo[A]: A = throw new UnsupportedOperationException;
def foo[A,B >: A](x: A): B = x;
}
Run Code Online (Sandbox Code Playgroud)
sbt doc我跑了
Doc.scala:1:警告:链接目标"Doc.foo"不明确.几个(可能是超载的)成员符合目标:
foo[A,B>:A](x:A):B对象Doc中的方法[已选择]foo[A]:Nothing对象Doc中的方法
使用foo[A,B >: A]等链接不起作用.
我想学习这个概念,这样我就能理解和使用诸如机器之类的库.
我试图关注RúnarBjarnason关于机器的讨论,但信息太少,基本上只是一堆数据类型.我甚至无法理解什么k是
newtype Machine k o = Step k o (Machine k o)
data Step k o r = Stop
| Yield o r
| forall t . Await (t -> r) (k t) r
Run Code Online (Sandbox Code Playgroud)
或者t它是什么以及它为什么被量化.或者,管道式库和机器之间的概念差异是什么?
我了解到我应该解锁逆序以锁定订单.例如.
A.lock();
B.lock();
B.unlock();
A.unlock();
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做会发生什么:
A.lock();
B.lock();
A.unlock();
B.unlock();
Run Code Online (Sandbox Code Playgroud)
我尝试制作一个死锁场景,但如果我总是先锁定A然后B,那么我不知道会发生什么样的死锁.你能帮我吗?
在Haskell Wiki的monad中的递归中有一个声称是尾递归的例子:
f 0 acc = return (reverse acc)
f n acc = do
v <- getLine
f (n-1) (v : acc)
Run Code Online (Sandbox Code Playgroud)
虽然命令式符号使我们相信它是尾递归的,但它根本不是那么明显(至少对我而言).如果我们去糖,do我们得到
f 0 acc = return (reverse acc)
f n acc = getLine >>= \v -> f (n-1) (v : acc)
Run Code Online (Sandbox Code Playgroud)
并重写第二行导致
f n acc = (>>=) getLine (\v -> f (n-1) (v : acc))
Run Code Online (Sandbox Code Playgroud)
所以我们看到它f发生在第二个参数内>>=,而不是在尾递归位置.我们需要考察IO的>>=得到答案.显然,将递归调用作为do块中的最后一行是一个尾递归函数的充分条件.
假设monad是尾递归的,如果这个monad中的每个递归函数都定义为 …
在对文件Free说:
许多常见的单子出现为免费单子,
- 鉴于
data Empty a,Free Empty与Identitymonad 同构.- Free
Maybe可用于建模偏好monad,其中每个图层表示运行计算的时间更长.
还有哪些monad可以使用Free?
我只想到一个:我相信Free (Const e)是同构的Either e.
编辑:哪些monad 不能用于表达Free?为什么?
如上所述这个问题/答案,Functor实例唯一确定的,如果他们存在.
对于列表,有两个众所周知的Applicative实例:[]和ZipList.因此,应用型不是唯一的(见GHC可以导出函子与应用型实例的单子变压器?而且为什么没有-XDeriveApplicative推广?).但是,ZipList需要无限列表,因为它pure无限期地重复给定元素.
Applicative实例?去进一步,如果我们能够扩大双方[]和ZipList一个单子,我们会在那里有一个单子不是唯一的数据类型和其确定的函数对象的例子.唉,只有当我们将自己限制在无限列表(流)时才有ZipList Monad实例.并且为了创建单元素列表,所以它需要有限列表.因此:return[]
如果有一个包含两个或更多不同实例的示例,则会出现一个明显的问题,如果它们必须/可以具有相同的Applicative实例:
最后我们可以为Alternative/MonadPlus提出同样的问题.由于存在两组不同的MonadPlus法则,这很复杂.假设我们接受一套法律(对于Applicative我们接受右/左分配/吸收,也参见这个问题),
如果以上任何一个都是独一无二的,我会有兴趣知道为什么,要有一丝证明.如果没有,反例.
我见过这个
ListT是一个不满足monad定律的有缺陷的monad变换器的典型例子.
这可以通过一个简单的例子来证明吗?
编辑:我的想法ListT []有点不对,我错过了文档要求内部monad是可交换的.那么,ListT只是在有这个要求的意义上,或者是否存在另一个问题?(Haskell wiki的例子都使用ListT IO,IO显然不是可交换的.)
我非常喜欢以通用的方式使用catamorphisms/anamorphisms的想法,但在我看来它有一个显着的性能缺点:
假设我们希望以分类方式使用树结构 - 使用通用的catamorphism函数描述不同的折叠:
newtype Fix f = Fix { unfix :: f (Fix f) }
data TreeT r = Leaf | Tree r r
instance Functor TreeT where
fmap f Leaf = Leaf
fmap f (Tree l r) = Tree (f l) (f r)
type Tree = Fix TreeT
catam :: (Functor f) => (f a -> a) -> (Fix f -> a)
catam f = f . fmap (catam f) . unfix
Run Code Online (Sandbox Code Playgroud)
现在我们可以编写如下函数:
depth1 :: Tree …Run Code Online (Sandbox Code Playgroud) haskell ×8
monads ×5
free-monad ×2
functor ×2
android ×1
applicative ×1
catamorphism ×1
concurrency ×1
conduit ×1
dalvik ×1
deadlock ×1
frege ×1
fusion ×1
ghc ×1
locking ×1
method-names ×1
optimization ×1
scala ×1
scala-2.10 ×1
scaladoc ×1