Haskell新手在这里。
所以(<$>)
定义为
(<$>) :: Functor f => (a -> b) -> f a -> f b
(<*>)
定义为
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
但我觉得Applicative
是两个概念:
(<@>) :: MyConcept m => m (a -> b) -> a -> b
所以,例如根据{{1}}:
进行思考我有一个Maybe
我有一个let i = 4
。
基本上我有一个函数可能有也可能没有,它接受一个Int并返回一个Int和一个实际的Int。
当然,我可以通过说:
来包裹let foo = Nothing :: Num a => Maybe (a -> a)
i
但是这需要我知道Applicative foo <*> Just i
的内容。
有什么东西等同于我在这里描述的东西吗?我将如何自己实现该功能foo
?
这将是这样的:
<@>
答案 0 :(得分:4)
您可以使用pure
:
pure :: Applicative f => a -> f a
foo <*> pure i
虽然您可以使用fmap
:
fmap (\f -> f i) foo
或
fmap ($ i) foo
答案 1 :(得分:3)
(<@>) :: MyConcept m => m (a -> b) -> a -> b
要查看这是否类似于申请,请尝试从<@>
和<*>
派生pure
。你会发现这是不可能的。
<@>
extract :: (Counit w) => w a -> a
extract
Maybe
更适用于Nothing
的{{1}}。
您可以为{{1}}实施{{1}}吗?如果值为{{1}},您会怎么做?