2016-05-07 44 views
3

Haskell新手。 所以(<$>)定義爲(<*>),而不必在此包裝第二個參數

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

而且(<*>)被定義爲

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

但我覺得Applicative是一個兩個概念:

  1. 一個將是一個函子
  2. 而一個會是這樣的:
([email protected]>) :: MyConcept m => m (a -> b) -> a -> b

例如,根據Maybe

我有一個let i = 4,我有一個let foo = Nothing :: Num a => Maybe (a -> a)。 基本上我有一個函數,可能會或可能不會在那裏,需要一個Int並返回一個Int,並且一個實際的Int。

當然我也只是說換i

foo <*> Just i 

但是,這要求我知道什麼應用型foo被包裹在 有什麼等效於這裏描述的我?我將如何去執行我自己的功能<@>

這將是這樣的:

let (<@>) func i = func <*> ??? i 

回答

4

您可以使用pure

pure :: Applicative f => a -> f a 

foo <*> pure i 

雖然你可以只使用fmap

fmap (\f -> f i) foo 

fmap ($ i) foo 
+0

謝謝! 「純」不是以某種方式誤導?從名字上我會想到完全相反。例如'讓不純= pure :: a - > IO a'。有什麼理由嗎? – hgiesel

+2

@hgiesel它是[只是一個名字](http://stackoverflow.com/questions/3435308/naming-of-pure-function-in-control-applicative)和純度無關。 – erisco

+1

@hgiesel我把'pure x'讀爲「在應用中注入純粹的價值'x」(即使這個讀法意味着應用價值在某種程度上是不純的,但情況並非如此......) – chi

3
(<@>) :: MyConcept m => m (a -> b) -> a -> b 

要看看這就像一個適用嘗試從<*>pure獲得<@>。你會發現這是不可能的。

在這裏你可以找到<@>在更一般的形式是extract :: (Counit w) => w a -> acomonads

你能實施extractMaybe?當價值是Nothing時,你會做什麼?

相關問題