标签: monads

如果返回a = return b那么a = b?

如果那样的return a = return b话你能证明a=b吗?当我使用时=,我的意思是在法律和证据意义上,而不是Eq阶级意义上.

我认识的每一个单子似乎都满足了这一点,我想不出一个有效的monad(Const a不是一个算子和应用,而不是一个monad.)

monads haskell equality semantics equational-reasoning

46
推荐指数
1
解决办法
3678
查看次数

ST Monad ==代码味道?

我正在努力在Haskell中实现UCT算法,这需要大量的数据杂耍.没有太多细节,它是一个模拟算法,在每个"步骤",基于一些统计属性选择搜索树中的叶节点,在该叶子上构造新的子节点,并且对应于新叶及其所有祖先都会更新.

鉴于所有这些杂耍,我并不是非常敏锐,无法弄清楚如何使整个搜索树成为Okasaki的一个不可改变的数据结构.相反,我一直在玩STmonad,创建由可变STRefs 组成的结构.一个人为的例子(与UCT无关):

import Control.Monad
import Control.Monad.ST
import Data.STRef

data STRefPair s a b = STRefPair { left :: STRef s a, right :: STRef s b }

mkStRefPair :: a -> b -> ST s (STRefPair s a b)
mkStRefPair a b = do
    a' <- newSTRef a
    b' <- newSTRef b
    return $ STRefPair a' b'

derp :: (Num a, Num b) => STRefPair s a b -> ST s …
Run Code Online (Sandbox Code Playgroud)

monads state haskell state-monad

45
推荐指数
3
解决办法
7407
查看次数

如何登录Haskell?

我正在尝试使用HSlogger获取有关我的程序的一些信息.所以我在我的函数中添加以下行

import Data.Word
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
import Data.Bits
import Data.Int
import Data.ByteString.Parser

import System.Log.Logger
import System.Log.Handler.Syslog


importFile :: FilePath -> IO (Either String (PESFile ))
importFile n = do
     warningM "MyApp.Component2" "Something Bad is about to happen."
     ...
Run Code Online (Sandbox Code Playgroud)

这很好,因为函数在IO内部.但是,当我向以下函数添加类似的行时:

...
parsePES :: Parser PESFile
parsePES = do
        header <- string "#PES"
        warningM "parsing header"
        ...
        return (PESFile ...)
Run Code Online (Sandbox Code Playgroud)

我收到类型错误:

 Couldn't match expected type `Parser a0'
                with actual type `String -> IO ()'
    In …
Run Code Online (Sandbox Code Playgroud)

monads logging haskell

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

为什么Applicative应该是Monad的超类?

鉴于:

Applicative m, Monad m => mf :: m (a -> b), ma :: m a
Run Code Online (Sandbox Code Playgroud)

它似乎被认为是一项法律:

mf <*> ma === do { f <- mf; a <- ma; return (f a) }
Run Code Online (Sandbox Code Playgroud)

或者更简洁:

(<*>) === ap
Run Code Online (Sandbox Code Playgroud)

说的文档Control.Applicative<*>是"顺序应用程序",这表明了这一点(<*>) = ap.这意味着<*>必须从左到右依次评估效果,以保持一致>>=...但这感觉不对.McBride和Paterson的原始论文似乎暗示从左到右的排序是任意的:

IO monad,实际上任何Monad,都可以通过取pure= return<*>=来实现ap.我们也可以使用它的变量ap以相反的顺序执行计算,但我们将在本文中保持从左到右的顺序.

因此,有两个合法的,非平凡的推导<*>来源于>>=并且return具有不同的行为.在某些情况下,既没有这两个推导是可取的.

例如,(<*>) === …

monads haskell applicative fam-proposal

43
推荐指数
3
解决办法
2605
查看次数

你如何识别monadic设计模式?

我学习Haskell的方式我开始掌握monad概念并开始在我的代码中使用已知的monad但是从设计者的角度来看我仍然很难接近monad.在OO中有几个规则,比如"识别名词"对象,注意某种状态和界面......但是我无法找到monad的等效资源.

那么你如何将问题确定为monadic?monadic设计有哪些好的设计模式?当你意识到某些代码会更好地重构为monad时,你的方法是什么?

monads haskell functional-programming

41
推荐指数
3
解决办法
3399
查看次数

RxJava - 获取列表中的每个项目

我有一个返回an的方法Observable<ArrayList<Long>>,它是一些Items的id.我想通过这个列表并使用另一个返回的方法下载每个Item Observable<Item>.

我如何使用RxJava运算符执行此操作?

java monads reactive-programming rx-java

41
推荐指数
2
解决办法
4万
查看次数

为什么在Clojure中使用Maybe/Option并不是那么普遍?

为什么Clojure尽管如此强调功能范式,却不使用Maybe/ Optionmonad来表示可选值?Option在Scala中使用非常普遍,Scala是我经常使用的函数式编程语言.

monads functional-programming clojure option maybe

40
推荐指数
6
解决办法
8908
查看次数

取消选择选项

说我有一个val s: Option[Option[String]].因此它可以具有以下值:

Some(Some("foo")) Some(None) None

我想减少它,以便第一个成为Some("foo")另外两个成为None.很明显,有很多方法可以实现这一目标,但我正在寻找一种简单的,可能是内置的,不足一线的.

monads scala join flatten option

40
推荐指数
3
解决办法
9002
查看次数

使用带有Scala的Eithers"for"语法

据我了解,Scala"for"语法与Haskell的monadic"do"语法非常相似.在Scala中,"for"语法通常用于Lists和Options.我想将它与Eithers 一起使用,但默认导入中不存在必要的方法.

for {
  foo <- Right(1)
  bar <- Left("nope")
} yield (foo + bar)

// expected result: Left("nope")
// instead I get "error: value flatMap is not a member..."
Run Code Online (Sandbox Code Playgroud)

这个功能是通过一些导入提供的吗?

有一个轻微的障碍:

for {
  foo <- Right(1)
  if foo > 3
} yield foo
// expected result: Left(???)
Run Code Online (Sandbox Code Playgroud)

对于列表,它将是List().因为Option,它会None.Scala标准库是否为此提供了解决方案?(或许scalaz?)怎么样?假设我想为Either提供我自己的"monad实例",我怎么能这样做?

monads scala typeclass either for-comprehension

40
推荐指数
3
解决办法
1万
查看次数

在"反向"中使用Maybe Monad

假设我有很多功能:

f :: a -> Maybe a
g :: a -> Maybe a
h :: a -> Maybe a
Run Code Online (Sandbox Code Playgroud)

我想用以下方式组合它们:如果f返回Nothing,则计算g.如果g返回Nothing,则计算h.如果其中任何一个计算Just a,请停止链.而整个构图(例如f)当然应该返回Maybe a.

这与Maybe monad的典型使用相反,如果返回Nothing,通常会停止计算.

用于链接这样的计算的Haskell成语是什么?

monads haskell

39
推荐指数
1
解决办法
2240
查看次数