- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些丑陋的数据,需要进行许多丑陋的null检查。我的目标是编写一个函数集,以使用Maybe monad将空检查保持在最低限度,从而以无点声明式访问/修改它。理想情况下,我可以将Ramda与monad一起使用,但是效果不是很好。
这有效:
const Maybe = require('maybe');
const R = require('ramda');
const curry = fn => (...args) => fn.bind(null, ...args);
const map = curry((fn, monad) => (monad.isNothing()) ? monad : Maybe(fn(monad.value())));
const pipe = (...fns) => acc => fns.reduce((m, f) => map(f)(m), acc);
const getOrElse = curry((opt, monad) => monad.isNothing() ? opt : monad.value());
const Either = (val, d) => val ? val : d;
const fullName = (person, alternative, index) => R.pipe(
map(R.prop('names')),
map(R.nth(Either(index, 0))),
map(R.prop('value')),
map(R.split('/')),
map(R.join('')),
getOrElse(Either(alternative, ''))
)(Maybe(person));
最佳答案
首先要做的事情
Maybe
实现(link)几乎是垃圾-您可能要考虑选择一个不需要实现Functor接口(interface)的实现(就像您对map
所做的一样)–我可能会从民俗中建议Data.Maybe。或者,因为您显然不害怕自己执行事情,所以可以自己制作也许^ _ ^ map
实现不适用于要实现functor接口(interface)的任何functor。即,您的仅适用于Maybe
,但是map
应该足够通用,以便与任何可映射对象一起工作(如果有这样的话)。map
–只需将其与实现Maybe
方法的.map
(例如,Data。也许在上面引用)一起使用curry
实现无法正确处理函数。它仅适用于Arity为2的函数-curry应该适用于任何函数长度。// given, f
const f = (a,b,c) => a + b + c
// what yours does
curry (f) (1) (2) (3) // => Error: curry(...)(...)(...) is not a function
// because
curry (f) (1) (2) // => NaN
// what it should do
curry (f) (1) (2) (3) // => 6
curry
,因为它已经包含curry pipe
实现将功能组成和映射函子的关注混合在一起(通过使用map
)。我建议专门为函数组合保留pipe
。pipe
// you're doing
R.pipe (a,b,c) (Maybe(x))
// but that's the same as
R.pipe (Maybe,a,b,c) (x)
Either
可能不是您正在考虑的Either函数或monad。有关更完整的实现,请参见 Data.Either
(来自民间故事)Maybe
实现Functor
和Monad
,因此它既可以充当行为(也可以实现其实现的任何其他接口(interface))!在这种情况下,Either
也是如此。Kleisli category
以了解单子(monad)函数的组成,尽管对于这个特定问题它可能与您无关。 functor laws
where
map :: Functor f => (a -> b) -> f a -> f b
,id
is the identity functiona -> a
, andf :: b -> c
andg :: a -> b
// identity
map(id) == id
// composition
compose(map(f), map(g)) == map(compose(f, g))
map
的调用,或者我们可以首先对所有功能进行组合,然后对
map
进行一次编写。 –注意在合成法的左侧,我们如何两次调用
.map
以应用两个功能,但是在右侧,
.map
仅被调用一次。每个表达式的结果相同。
monad laws
While we're at it, we can cover the monad laws too – again, if your data type obeys these laws, only then can it be called a monad.
where
mreturn :: Monad m => a -> m a
,mbind :: Monad m => m a -> (a -> m b) -> m b
// left identity
mbind(mreturn(x), f) == f(x)
// right identity
mbind(m, mreturn) == m
// associativity
mbind(mbind(m, f), g) == mbind(m, x => mbind(f(x), g))
composek
来查看定律可能会更容易一些-现在很明显,Monads确实遵守了关联律
monad laws defined using Kleisli composition
where
composek :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)
// kleisli left identity
composek(mreturn, f) == f
// kleisli right identity
composek(f, mreturn) == f
// kleisli associativity
composek(composek(f, g), h) == composek(f, composek(g, h))
map
方面,因此我将帮助您看到一个简单的转换。这利用了上面说明的Functor组成定律:
R.pipe
,它是从左到右而不是像
R.compose
一样从右到左组成的。使用
I prefer right-to-left composition时,可以选择使用
pipe
和
compose
–这只是符号上的区别;无论哪种方式,法律都得到遵守。
// this
R.pipe(map(f), map(g), map(h), map(i)) (Maybe(x))
// is the same as
Maybe(x).map(R.pipe(f,g,h,i))
Maybe(person)
开头person.names
属性person.names
的第一个索引–是数组还是其他东西?或名字的首字母? .value
属性?我们在这里等一个单子(monad)吗? (请查看.chain
与我从民俗故事链接的.map
和Maybe
实现中的Either
进行比较)/
上的值''
加入值关于javascript - Monad的功能组合…不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44515578/
monad 被定义为类别 C 上的内仿函数。假设 C 具有类型 int 和 bool 以及其他构造类型作为对象。现在让我们考虑在这个类别上定义的列表 monad。 根据它的定义,list 是一个内仿函
我试图采取例如ExceptT a (StateT A M) , 对于某些具体类型 A和单子(monad)M ,并将它们包装到我的新自定义单子(monad)中。 首先我确定StateT A M经常出现在
我读到(例如 here 和 here )所有基本单子(monad)(Mabye, Error, ...) 源自其相应的 monad 转换器(MaybeT, ErrorT, ...) 使用身份 mona
Haskell 的状态单子(monad) State s a迫使我保持相同类型的 s在整个做 block 期间。但是由于 state monad 实际上只是一个函数,如果我将它定义为 State
我一直在阅读some materials on free monads而且我真的不认为我离实现更近了,但我认为我更接近于理解它们是什么! 鉴于上述大量资源,我的理解是自由单子(monad)从“计算”工
假设我有一个由两个 monad 操作组成的函数: co::Monad m => m a -> m a -> m a 您可以将 co 视为一个高阶函数,它描述两个单子(monad)操作如何相互协作来完成
在 SO解释了为什么像 scalaz、cats (Scala) 或 Arrow (Kotlin) 中的 Validation 不能是 monad。 据我所知,这是因为他们已经根据应用仿函数对 mona
我对 Haskell 还很陌生,并且慢慢地意识到 Monad fail 的存在有问题。真实世界的 Haskell warns against its use (“再一次,我们建议您几乎总是避免使用失败
我正在阅读现实世界 Haskell 中的 monad 转换器。在以下示例中,堆栈为 Writer在顶部State在Reader之上在IO之上。 {-# Language GeneralizedNewt
我看到的典型 Pause monad 实现如下所示(基于 Giulia Costantini 和 Giuseppe Maggiore 编写的 Friendly F# 的第 5 章)。 open Sys
“Monads 允许程序员使用顺序构建 block 来构建计算”,因此它允许我们组合一些计算。如果是这样,那为什么下面的代码不能运行呢? import Control.Monad.Trans.Stat
这是我第一次认识 Monad Transformers,所以答案可能很明显。 假设我在 StateT MyMonad MyType 类型的 do 块中,我想让另一个相同类型的函数修改状态并返回 MyM
人们通常说类型是单子(monad)。 在某些函数式语言和库(如 Scala/Scalaz)中,您有一个类型构造函数,如 List 或 Option,您可以定义一个与原始类型分离的 Monad 实现。所
我的目标是创建一个函数,该函数在 ReaderT WriterT 堆栈或 RWS 堆栈中使用 list monad。更一般地说,我如何在 mtl 类型类(如 MonadReader、MonadWrit
我只是想知道是否有一个简洁的术语来表示既是单子(monad)又是单子(monad)的东西。我做了一些搜索,我知道these structures exist ,但我还没有找到他们的名字。 最佳答案 在
我正在玩写一个网络应用程序。在这种情况下,我使用 scotty和 redis ,但是这个问题出现在任何 web/db 组合中。在此之前我使用了 happstack,所以我也喜欢那里的一个例子。 Sco
是 x >>= f相当于 retract (liftF x >>= liftF . f) ? 也就是说,从同样是 Monad 的 Functor 构建的自由 monad 的 monad 实例是否将具有
我正在尝试编写一个只能包含 Num 的新 monad。当它失败时,它返回 0,就像 Maybe monad 在失败时返回 Nothing 一样。 这是我到目前为止所拥有的: data (Num a)
我正在使用 operational monad作者:海因里希·阿普菲尔姆斯。 我想用结果类型的 monad 参数化解释器。 我的代码的以下版本编译: {-# LANGUAGE GADTs #-} im
假设所有的 monad 都可以用 Free 来表示。 (如果这不是真的,什么是反例,为什么)?怎么可能the continuation monad或其对应的变压器用 Free 表示或 FreeT -
我是一名优秀的程序员,十分优秀!