成语描述效果的可能性
Idiom to describe possibility of effect
有时候我需要写一个可能有效果也可能没有效果的函数。
是否有功能(或其他)成语来描述这种情况?前缀 maybe
描述了它,但是有一些惯用的东西吗?
例如:
function maybe(guardCb) {
return function(cb) {
return function() {
if(guardCb.apply(this, arguments)) {
return cb.apply(this, arguments);
}
}
};
}
function isFoo(args) {
return args.isFoo();
}
function doSomething(args) {
return foo.bar(args.bam);
}
maybe(isFoo)(doSomething)(args);
我知道 maybe monad,但它似乎与此不同。
我觉得用"possible"这个词来暗示函数的作用比较合适
correctPossibleError()
handlePossibleNameChange()
erasePossibleOuterCircle()
includePossibleMatches()
这只是一个纯函数。等效的 Haskell 代码是:
maybe :: (a -> Bool) -> (a -> b) -> a -> Maybe b
maybe p f x = if p x then Just (f x) else Nothing
example = maybe p f x
这个函数没有特殊的名称。不过可以简化一下:
maybe :: Bool -> b -> Maybe b
maybe b y = if b then Just y else Nothing
example = (maybe <$> p <*> f) x
请注意 p :: a -> Bool
、f :: a -> b
和 maybe p f :: a -> Maybe b
都有一个共同点(即 ((->) a)
)。这是Reader
interface and it can be abstracted out using the Applicative
类型class,我就是这样做的。
但是,这不是好的代码。更好的抽象是:
maybe :: (a -> Maybe b) -> (b -> c) -> a -> Maybe c
maybe p f = fmap f . p
请注意 p :: a -> Maybe b
现在是 Kleisli arrow 而不是简单的谓词函数。我们已将条件逻辑移出 maybe
函数。在 JavaScript 中,您的代码现在是:
isFoo(args).map(doSomething);
您需要做的就是定义一个 Maybe
数据类型并实现它的 Functor
接口:
function Maybe(constructor) {
this.constructor = constructor || this;
}
var Nothing = new Maybe;
function Just(value) {
var maybe = new Maybe(Just);
maybe.value = value;
return maybe;
}
Maybe.prototype.map = function (functor) {
switch (this.constructor) {
case Nothing: return Nothing;
case Just: return Just(functor(this.value));
}
};
当然,你还需要重新定义isFoo
如下:
function isFoo(args) {
return args.isFoo() ? Just(args) : Nothing;
}
doSomthing
功能可以保持原样。希望对您有所帮助。
您要查找的成语是Functor
接口。
有时候我需要写一个可能有效果也可能没有效果的函数。
是否有功能(或其他)成语来描述这种情况?前缀 maybe
描述了它,但是有一些惯用的东西吗?
例如:
function maybe(guardCb) {
return function(cb) {
return function() {
if(guardCb.apply(this, arguments)) {
return cb.apply(this, arguments);
}
}
};
}
function isFoo(args) {
return args.isFoo();
}
function doSomething(args) {
return foo.bar(args.bam);
}
maybe(isFoo)(doSomething)(args);
我知道 maybe monad,但它似乎与此不同。
我觉得用"possible"这个词来暗示函数的作用比较合适
correctPossibleError()
handlePossibleNameChange()
erasePossibleOuterCircle()
includePossibleMatches()
这只是一个纯函数。等效的 Haskell 代码是:
maybe :: (a -> Bool) -> (a -> b) -> a -> Maybe b
maybe p f x = if p x then Just (f x) else Nothing
example = maybe p f x
这个函数没有特殊的名称。不过可以简化一下:
maybe :: Bool -> b -> Maybe b
maybe b y = if b then Just y else Nothing
example = (maybe <$> p <*> f) x
请注意 p :: a -> Bool
、f :: a -> b
和 maybe p f :: a -> Maybe b
都有一个共同点(即 ((->) a)
)。这是Reader
interface and it can be abstracted out using the Applicative
类型class,我就是这样做的。
但是,这不是好的代码。更好的抽象是:
maybe :: (a -> Maybe b) -> (b -> c) -> a -> Maybe c
maybe p f = fmap f . p
请注意 p :: a -> Maybe b
现在是 Kleisli arrow 而不是简单的谓词函数。我们已将条件逻辑移出 maybe
函数。在 JavaScript 中,您的代码现在是:
isFoo(args).map(doSomething);
您需要做的就是定义一个 Maybe
数据类型并实现它的 Functor
接口:
function Maybe(constructor) {
this.constructor = constructor || this;
}
var Nothing = new Maybe;
function Just(value) {
var maybe = new Maybe(Just);
maybe.value = value;
return maybe;
}
Maybe.prototype.map = function (functor) {
switch (this.constructor) {
case Nothing: return Nothing;
case Just: return Just(functor(this.value));
}
};
当然,你还需要重新定义isFoo
如下:
function isFoo(args) {
return args.isFoo() ? Just(args) : Nothing;
}
doSomthing
功能可以保持原样。希望对您有所帮助。
您要查找的成语是Functor
接口。