(< *>)而不必包装第二个参数

时间:2016-05-07 15:35:28

标签: haskell functor applicative

Haskell新手在这里。 所以(<$>)定义为

(<$>) :: Functor f => (a -> b) -> f a -> f b

(<*>)定义为

(<*>) :: Applicative f => f (a -> b) -> f a -> f b

但我觉得Applicative是两个概念:

  1. 一个是仿函数
  2. 一个就是这个:
  3. (<@>) :: MyConcept m => m (a -> b) -> a -> b

    所以,例如根据{{​​1}}:

    进行思考

    我有一个Maybe我有一个let i = 4。 基本上我有一个函数可能有也可能没有,它接受一个I​​nt并返回一个Int和一个实际的Int。

    当然,我可以通过说:

    来包裹let foo = Nothing :: Num a => Maybe (a -> a)
    i

    但是这需要我知道Applicative foo <*> Just i 的内容。 有什么东西等同于我在这里描述的东西吗?我将如何自己实现该功能foo

    这将是这样的:

    <@>

2 个答案:

答案 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}},您会怎么做?