2016-11-10 1 views

Répondre

6

(@ x) pour tout opérateur @ est équivalent à \a -> a @ x; donc ($ 3) est équivalent à \f -> f $ 3, c'est-à-dire une fonction qui applique n'importe quelle fonction que vous transmettez à 3. Cette syntaxe est appelée "sections".

> let f = ($ 3) 
> f show 
"3" 
> f square 
9 
8

($ 3) est une section, et est équivalent à \f -> f 3, qui prend un argument de fonction et l'applique à 3.

Si nous avons considéré 3 être un entier, nous avons que le type de f est Int -> b (pour tout b), donc le type de ($ 3) serait (Int -> b) -> b.

choses dans Haskell sont un peu plus complexe, car 3 peut être de tout type numérique, donc on n'a pas vraiment besoin f :: Int -> b, il est suffisant f :: a -> ba est un type numérique. Par exemple, nous obtenons ($ 3) :: Num a => (a -> b) -> b.

3

Une autre façon de regarder est

($) :: (a -> b) -> a -> b 
3 :: Num a => a 

et quand vous « insérez 3 » dans le ($), il deviendra

($ 3) :: Num a => (a -> b) -> b. 

en raison de ce que vous n'avez plus besoin de fournir l'un, mais la fonction que vous devez fournir est maintenant limitée à num, puisque le 3 peut être n'importe quel type numérique.

C'est au moins la façon dont je vois les fonctions dans Haskell, comme la substitution en algèbre.