相关疑难解决方法(0)

类型MonadPlus,Alternative和Monoid之间的区别?

标准库的Haskell类型类MonadPlus,Alternative以及Monoid各自提供两种方法具有基本相同的语义:

  • 空值:mzero,emptymempty.
  • 操作员a -> a -> a,在类型类联接值加在一起:mplus,<|>mappend.

所有这三个都规定了应遵守的法律:

mempty `mappend` x = x
x `mappend` mempty = x
Run Code Online (Sandbox Code Playgroud)

因此,似乎三个类型都提供相同的方法.

(Alternative也提供somemany,但它们的默认定义通常是足够的,所以它们在这个问题上并不太重要.)

所以,我的疑问是:为什么这三个极为相似的类?除了不同的超类限制之外,它们之间是否有任何真正的区别?

haskell functional-programming typeclass applicative monoids

80
推荐指数
1
解决办法
5625
查看次数

GHC Haskell目前的约束系统有什么问题?

我听说Haskell的"破坏"约束系统存在一些问题,如GHC 7.6及以下版本.它出什么问题了?是否有可比的现有系统克服了这些缺陷?

例如,edwardk和tekmo都遇到了麻烦(例如来自tekmo的评论).

haskell typeclass

42
推荐指数
2
解决办法
2497
查看次数

我教ghci来编译我的StackOverflow帖子.我可以让它更光滑吗?

Haskell Stack Overflow布局预处理器

module StackOverflow where  -- yes, the source of this post compiles as is
Run Code Online (Sandbox Code Playgroud)

如果您想先玩这个(1/2向下),请跳到下面的操作以使其正常工作.如果我稍微
停下来,你会跳到我想要的东西,你只想找到我正在寻求的帮助.

TLDR问题摘要:

  1. 我可以使用ghci将文件名完成添加到:so我在我定义的命令中ghci.conf吗?
  2. 我可以以某种方式定义一个ghci命令来返回编译代码而不是返回一个ghci命令,或者ghci是否有更好的方法让我将Haskell代码作为特定于文件扩展名的预处理器插入,因此:l可以用于.hs.lhs像往常一样的文件,但使用我的手写预处理器的.so文件?

背景:

Haskell支持.lhs源文件中的文字编程,有两种方式:

  • 乳胶风格\begin{code}\end{code}.
  • Bird track:Code开头>,其他任何东西都是评论.
    代码和注释之间必须有一个空行(以防止意外误操作>).

Bird不跟踪类似于StackOverflow代码块的规则声音吗?

参考文献: 1. 将.ghci手册 2. GHCI haskellwiki 3. 关于尼尔·米切尔的博客:{,并:}在.ghci

预处理器

我喜欢在文本编辑器中编写SO答案,我喜欢发表一个包含有效代码的帖子,但最后还是>在发布之前我必须编辑的注释块或者s,这不那么有趣.

所以,我自己写了一个预处理器.

  • 如果我在代码块中粘贴了一些ghci,它通常以*或开头:. …

haskell ghci

34
推荐指数
1
解决办法
1883
查看次数

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
查看次数

Monad是一个替代但不是MonadPlus的例子是什么?

他的回答这个问题"类型类之间的区别MonadPlus,Alternative以及Monoid?",爱德华Kmett说,

而且,即使Applicative是超级课程Monad,你最终还是需要MonadPlus上课,因为顺从

empty <*> m = empty
Run Code Online (Sandbox Code Playgroud)

并不足以证明这一点

empty >>= f = empty
Run Code Online (Sandbox Code Playgroud)

因此声称某事物是一件事,MonadPlus比宣称事情要强Alternative.

很明显,任何适用函子是不是一个单子是自动的一个例子Alternative是不是MonadPlus,但爱德华Kmett的回答意味着存在一个单子这是一个Alternative,但不是一个MonadPlus:它empty<|>将满足Alternative法律,1而不是MonadPlus法律.2 我自己无法想出这样的例子; 有人知道吗?


1我无法找到一套规则的规范参考Alternative,但是我将我认为它们的内容大概放在我对" 类型类的含义及其与其他类型的关系的混淆"这一问题的答案的中间.类"(搜索短语"正确的分配").我认为应该遵守的四项法律是:Alternative

  1. 正确的分配性<*>:  (f …

math monads haskell applicative

24
推荐指数
1
解决办法
874
查看次数

Monoid与MonadPlus

我对这两者都很陌生Monads,Monoids而且最近也学到了MonadPlus.从我所看到的,MonoidMonadPlus都提供了二元结合运算和身份类型.(我用数学的说法称之为半群.)那么Monoid和之间的区别是MonadPlus什么?

monads haskell typeclass monoids

23
推荐指数
3
解决办法
4112
查看次数

'Alternative'类型类中的'some'和'many'函数

哪些功能somemanyAlternative类型类有用吗?Docs提供了一个我无法理解的递归定义.

haskell functional-programming typeclass

17
推荐指数
2
解决办法
2220
查看次数

为什么'Control.Applicative.Const'没有'Alternative'实例

有一个实例Monoid a => Monoid (Const a b)Const从仿函数Control.Applicative.还有一个例子Monoid m => Applicative (Const m).

因此,我希望还有一个实例Monoid m => Alternative (Const m)与之相符Monoid.这只是一个应该修复的遗漏,还是有更深层次的原因?

haskell applicative monoids

14
推荐指数
1
解决办法
383
查看次数

实例在Haskell中替代ZipList?

ZipList附带一个Functor和一个Applicative实例(Control.Applicative),但为什么不选择Alternative?

  • 有没有好的例子?
  • 下面提出的那个怎么样?
    • 它有缺陷吗?
    • 它没用吗?
    • 是否有其他合理的可能性(如Bool可通过两种方式幺半群),因此也不应该是实例

我搜索了"实例替代ZipList"(用引号查找代码优先)并且只找到了库,一些教程,讲义而没有实际的实例.

马特芬威克说,如果A是,则ZipList A只会是一个幺半群.看到这里.无论元素类型如何,列表都是幺半群.

AndrewC对同一问题的另一个答案讨论了Alternative实例的外观.他说

Zip有两个合理的选择[1,3,4] <|> Zip [10,20,30,40]:

  1. Zip [1,3,4] 因为它是第一个 - 与Maybe一致
  2. Zip [10,20,30,40]因为它是最长的 - 与Zip []丢弃一致

Zip基本上是ZipList.我认为答案应该是Zip [1,3,4,40].我们来看一个实例:

instance Aternative Zip where
  empty = Zip []
  Zip xs <|> Zip ys = Zip (go xs ys) where
    go [] ys = ys
    go (x:xs) ys = x : go xs (drop 1 ys)
Run Code Online (Sandbox Code Playgroud)

唯一Zip …

haskell list typeclass applicative

9
推荐指数
1
解决办法
1041
查看次数

为什么`guard`基于`Alternative`?

为什么guard基于Alternative

guard :: Alternative f => Bool -> f ()
-- guard b is pure () if b is True,
-- and empty if b is False.
Run Code Online (Sandbox Code Playgroud)

我问因为guard只使用了empty来自Alternative.它不使用<|>Alternative根本.那么为什么要Alternative首先使用呢?

我想这是因为背后有一些不成文的想法Alternativeempty,与我们正在努力与实现的目标完全吻合guard(停止False,继续True).如果是这种情况,请告诉我这个没有说明的想法.

但与此同时,如果觉得我们只是在忽视<|>.感觉好像guard不是"完全捕捉"到底Alternative是什么.我希望这是有道理的.为了使它更具体:为什么他们不发明另一个类似Stoppable(或Abortable)之类的类型并使用它而不是Alternative

haskell

6
推荐指数
1
解决办法
309
查看次数