2017-04-18 74 views
0

我通常會聽到解除這個詞,當人們在談論map,foldbind時,但基本上並不是每個高階函數都有某種提升?提升與高階函數之間的區別

爲什麼不能filter是電梯從a -> Bool[a] -> [a],赫克甚至bool函數(型號if語句),可以被認爲是從電梯到a -> aBool -> a。如果它們不是,那麼爲什麼來自Applicative類型的ap被認爲是電梯?

如果重要的是從... a ...... f a ...,然後ap不適合的情況下,或者:f (a -> b) -> f a -> f b

回答

2

我很驚訝,沒有一個已經回答了這一點。

提升函數的作用是將函數提升到上下文中(通常是函子或單子)。因此,將類型爲a -> b的函數提升爲List上下文將導致List[a] -> List[b]類型的函數。如果你仔細想想這就是map(或Haskell中的fmap)所做的。事實上,它是Functor定義的一部分。

但是,函子只能提升一個參數的函數。我們也希望能夠處理其他領域的功能。例如,如果我們有一個a -> b -> c類型的函數,我們不能使用map。這是一個更普遍的提升操作進入圖片的地方。在Haskell我們有一個lift2這種情況:

lift2:: (a -> b -> c) -> (M[a] -> M[b] -> M[c]) 

其中M[a]是一些特定的單子(比如List)參數與給定類型a

lift還有其他變體也定義爲其他arities。

這也是爲什麼filter不是提升功能,因爲它不適合所需的類型簽名;您沒有提起a -> boolM[a] -> M[bool]的功能。但是,它是一個更高級的函數。

如果你想了解更多關於解除Haskell Wiki的good article on it