小编Pet*_*lák的帖子

如何消除scaladoc中方法的链接歧义?

我正在使用重载方法记录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]等链接不起作用.

scala method-names disambiguation scaladoc scala-2.10

29
推荐指数
4
解决办法
8543
查看次数

机器和管道(或其他类似的库)之间的概念差异是什么?

我想学习这个概念,这样我就能理解和使用诸如机器之类的库.

我试图关注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它是什么以及它为什么被量化.或者,管道式库和机器之间的概念差异是什么?

haskell conduit transducer-machines

28
推荐指数
1
解决办法
2735
查看次数

你会解释锁定顺序吗?

我了解到我应该解锁逆序以锁定订单.例如.

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,那么我不知道会发生什么样的死锁.你能帮我吗?

concurrency deadlock locking

27
推荐指数
3
解决办法
2万
查看次数

如何在Android上运行Frege程序?

我对函数式语言的Android编程感兴趣,最好是接近Haskell.弗雷格似乎是一个不错的选择.我发现有人已经做过这样的概念验证应用程序,但我找不到它的来源或类似的东西.

所以我的问题是,如何在Android上运行Frege程序,它有多难以及最终的障碍是什么?

android haskell dalvik frege

27
推荐指数
2
解决办法
2354
查看次数

在什么情况下monadic计算尾递归?

在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中的每个递归函数都定义为 …

monads haskell tail-recursion

26
推荐指数
2
解决办法
1550
查看次数

什么monad可以表示为free over some functor?

对文件Free说:

许多常见的单子出现为免费单子,

  • 鉴于data Empty a,Free EmptyIdentitymonad 同构.
  • Free Maybe可用于建模偏好monad,其中每个图层表示运行计算的时间更长.

还有哪些monad可以使用Free

我只想到一个:我相信Free (Const e)是同构的Either e.

编辑:哪些monad 不能用于表达Free?为什么?

monads haskell functor free-monad

26
推荐指数
3
解决办法
1615
查看次数

Applicative/Monad实例在多大程度上是唯一确定的?

如上所述这个问题/答案,Functor实例唯一确定的,如果他们存在.

对于列表,有两个众所周知的Applicative实例:[]ZipList.因此,应用型不是唯一的(见GHC可以导出函子与应用型实例的单子变压器?而且为什么没有-XDeriveApplicative推广?).但是,ZipList需要无限列表,因为它pure无限期地重复给定元素.

  • 是否有其他可能更好的数据结构示例至少有两个Applicative实例?
  • 有没有这样的例子只涉及有限的数据结构?也就是说,就像假设Haskell的类型系统区分归纳和共同数据类型一样,是否有可能唯一地确定Applicative?

去进一步,如果我们能够扩大双方[]ZipList一个单子,我们会在那里有一个单子不是唯一的数据类型和其确定的函数对象的例子.唉,只有当我们将自己限制在无限列表()时才有ZipList Monad实例.并且为了创建单元素列表,所以它需要有限列表.因此:return[]

  • Monad实例是否由数据类型唯一确定?或者是否有一个数据类型的示例可以有两个不同的Monad实例?

如果有一个包含两个或更多不同实例的示例,则会出现一个明显的问题,如果它们必须/可以具有相同的Applicative实例:

  • Monad实例是否由Applicative实例唯一确定,或者是否有一个Applicative的示例可以有两个不同的Monad实例?
  • 是否存在具有两个不同Monad实例的数据类型的示例,每个实例具有不同的Applicative超实例?

最后我们可以为Alternative/MonadPlus提出同样的问题.由于存在两组不同的MonadPlus法则,这很复杂.假设我们接受一套法律(对于Applicative我们接受右/左分配/吸收,也参见这个问题),

  • 是由Applicative唯一确定的替代品,Monad的MonadPlus,还是有反例?

如果以上任何一个都是独一无二的,我会有兴趣知道为什么,要有一丝证明.如果没有,反例.

monads haskell functor category-theory applicative

26
推荐指数
2
解决办法
1197
查看次数

为什么ListT单子变换器被认为是错误的 - 它破坏了monad法则?

我见过这个

ListT是一个不满足monad定律的有缺陷的monad变换器的典型例子.

这可以通过一个简单的例子来证明吗?

编辑:我的想法ListT []有点不对,我错过了文档要求内部monad是可交换的.那么,ListT只是在有这个要求的意义上,或者是否存在另一个问题?(Haskell wiki例子都使用ListT IO,IO显然不是可交换的.)

monads haskell functional-programming monad-transformers

25
推荐指数
1
解决办法
1857
查看次数

如何使用免费monad表达延续monad?

据说,所有的monad都可以使用Free(如果这不是真的,什么是反例和为什么)?如何使用或表示延续monad或其相应的变换器? - 相应的仿函数是什么?或者,如果他们不能,那是什么原因?FreeFreeT

更新:通过表达我的意思基本上是同构的Free F地方F就是我们要找的,例如像仿函数Writer w是同构的Free ((,) w).

monads continuations haskell free-monad

25
推荐指数
1
解决办法
1134
查看次数

是否有可能使GHC优化(砍伐森林)通用功能,如catamorphisms?

我非常喜欢以通用的方式使用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)

optimization haskell fusion ghc catamorphism

23
推荐指数
1
解决办法
567
查看次数