- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我一直在编写在 IO monad 中返回数据结构的 FFI 代码。例如:
peek p = Vec3 <$> (#peek aiVector3D, x) p
<*> (#peek aiVector3D, y) p
<*> (#peek aiVector3D, z) p
peek p = Vec3 <$> io1 <*> io2 <*> io3
peek p = liftA3 Vec3 io1 io2 io3
peek p = return Vec3 `ap` io1 `ap` io2 `ap` io3
peek p = liftM3 Vec3 io1 io2 io3
Applicative
之外的任何内容的单子(monad)代码。提供。编写此代码的首选方式是什么?我应该使用
Applicative
强调代码的作用,或者我应该使用
Monad
因为它可能 (?) 对
Applicative
进行了优化?
[liftA..liftA3]
,这个问题稍微复杂了一点。和
[liftM..liftM5]
但是我有几条超过三五个成员的记录,所以如果我决定使用
lift{A,M}
我失去了一些一致性,因为我必须对较大的记录使用不同的方法。
最佳答案
首先要记住的是,这比它应该的稍微复杂一些——任何 Monad
实例应该有一个关联的 Applicative
例如,liftM
和 liftA
功能一致。因此,这里有两个指导方针:
Monad
编写通用函数, 使用 liftM
公司避免与只有 Monad
的其他函数不兼容约束。 Monad
您知道的实例附带 Applicative
例如,使用 Applicative
运算符一致地用于您不需要的任何定义或子表达式 Monad
操作,但避免漫无目的地混用。 Should I use
Applicative
to emphasize what the code does, or should I useMonad
because it might (?) have optimizations overApplicative
?
Applicative
仅支持计算的静态“结构”,而
Monad
允许嵌入式控制流。考虑列表,例如 -
Applicative
,您所能做的就是生成所有可能的组合并转换每个组合——结果元素的数量完全由每个输入中的元素数量决定。与
Monad
,您可以根据输入的元素在每一步生成不同数量的元素,让您可以任意过滤或扩展。
Applicative
和
Monad
基于压缩无限流的实例--
Applicative
可以简单地以明显的方式将它们压缩在一起,而
Monad
必须重新计算很多东西然后扔掉。
liftA2 f x y
与
f <$> x <*> y
,或
Monad
等价物。我的建议是以下准则:
foo = liftA2 bar
而不是 foo x y = bar <$> x <*> y
——它更短,更清楚地表达了你在做什么。 liftA4
。等等,如果你需要的话。
关于haskell - liftM、lilftA等中首选什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9509350/
在 Haskell 中,(liftM .liftM)、(liftM .liftM .liftM) 等有别名吗? 这样我就不必那么冗长了,例如: (liftM . liftM) (+ 1) [Just
我试图理解下面的表达。它转换字符列表['a','b','c']到字符串列表 ["a", "b", "c"] liftM (:[]) "abc" 这是怎么发生的? 最佳答案 机器猴头运算符(operat
最近我一直在编写在 IO monad 中返回数据结构的 FFI 代码。例如: peek p = Vec3 (#peek aiVector3D, x) p (#peek
replicate 3 "hi" 产生 ["hi", "hi", "hi"] 但是 liftM (replicate 3) "hi" 产生 ["hhh", "iii"] liftM 是如何(精确地)运
monad 和 applicative 的区别在于前者可以根据之前的结果选择下一个计算: (\x -> if x == 1 then (\_ -> []) else (\y -> (\z -> \w
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 2年前关闭。 Improve th
在 Haskell 中使用一元表达式时,使用 liftM的(即使在中缀位置)对我来说通常显得很不美观且冗长。 大多数其他一元基元( >>= 、 >> )甚至 liftM的纯吊坠 $是中缀运算符。这让我
我有以下功能: sendq :: Socket -> B.ByteString -> String -> IO PortNumber -> IO () sendq s datastring host
我对 liftM 如何保留上下文感到困惑,特别是在 Writer monad 的情况下。我一直在阅读“Learn You a Haskell for Great Good”,并且一直停留在它对 lif
根据the Typeclassopedia (以及其他来源),Applicative逻辑上属于 Monad和 Pointed (因此 Functor )在类型类层次结构中,所以如果 Haskell 前
这个问题已经有答案了: What is the monomorphism restriction? (1 个回答) 已关闭 6 年前。 当我在 ghci 中定义此类函数时: > :m Control.
我有 getLinesIn = liftM lines 。 getContents 比 readAndWriteIn = do list m0 String 与实际类型 IO String 匹配
(注意:我使用 Haskell 术语来表达问题;欢迎使用相同的术语和/或范畴论的数学语言来回答,包括我谈到仿函数和单子(monad)定律时的正确数学定义和公理。) 众所周知,每个 monad 也是一个
在 Haskell 中,以下工作: > (+) `liftM` (Just 3) `ap` (Just 5) Just 8 Frege 提示使用括号: frege> (+) `liftM` (Just
如果我有一个采用两个类型参数的 monad 转换器类型,我可以使用 liftM将值提升到转换后的 monad 中: scala> val o = 1.point[List].liftM[OptionT
两个表达式 y >> pure x liftM (const x) y 在 Haskell 中具有相同的类型签名。我很好奇它们是否等价,但我既无法提供事实证明,也无法提供反例。 如果我们重写这两个表达
我是一名优秀的程序员,十分优秀!