如果那样的return a = return b话你能证明a=b吗?当我使用时=,我的意思是在法律和证据意义上,而不是Eq阶级意义上.
我认识的每一个单子似乎都满足了这一点,我想不出一个有效的monad(Const a不是一个算子和应用,而不是一个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) 我正在尝试使用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) 鉴于:
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具有不同的行为.在某些情况下,既没有这两个推导是可取的.
例如,(<*>) === …
我学习Haskell的方式我开始掌握monad概念并开始在我的代码中使用已知的monad但是从设计者的角度来看我仍然很难接近monad.在OO中有几个规则,比如"识别名词"对象,注意某种状态和界面......但是我无法找到monad的等效资源.
那么你如何将问题确定为monadic?monadic设计有哪些好的设计模式?当你意识到某些代码会更好地重构为monad时,你的方法是什么?
我有一个返回an的方法Observable<ArrayList<Long>>,它是一些Items的id.我想通过这个列表并使用另一个返回的方法下载每个Item Observable<Item>.
我如何使用RxJava运算符执行此操作?
为什么Clojure尽管如此强调功能范式,却不使用Maybe/ Optionmonad来表示可选值?Option在Scala中使用非常普遍,Scala是我经常使用的函数式编程语言.
说我有一个val s: Option[Option[String]].因此它可以具有以下值:
Some(Some("foo"))
Some(None)
None
我想减少它,以便第一个成为Some("foo")另外两个成为None.很明显,有很多方法可以实现这一目标,但我正在寻找一种简单的,可能是内置的,不足一线的.
据我了解,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实例",我怎么能这样做?
假设我有很多功能:
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成语是什么?