Je suis un peu nouveau à Haskell et j'ai du mal à comprendre comment des types dédurés et de telles œuvres.
foldr :: (a -> b -> b) -> b -> [a] -> b foldl :: (a -> b -> a) -> a -> [b] -> a foldl1 :: (a -> a -> a) -> [a] -> a
4 Réponses :
in Haskell, une variable minuscule est une variable de type. Tandis que Par exemple, supposons que vous aviez une fonction la définition antérieure de P> P> P> et La raison pour laquelle il est écrit drôle parce que vous pouvez appliquer partiellement des fonctions. Ici, je vais faire une nouvelle fonction basée sur l'application partielle de la carte: p> alors vous pouvez utiliser p> qui produirait le même résultat p> p> caractère code> signifie simplement
char code>,
A code> ou
b code> pourrait signifier
char code> ou < Code> BOOL CODE> ou
INTEGER code> ou un autre type. La clé est que tout
A code> S sera le même type. Et tout
b code> s sera le même type.
carte code> prend comme premier argument une fonction qui prend une variable de type
A Code> et renvoie un autre type
B code>. Alors
mappe code> renvoie une nouvelle fonction qui prend une liste de type
A code>. Cette nouvelle fonction renvoie une liste de type
b code>. P>
incrément code> qui a ajouté un à un entier.
incrément de carte [1,2,3] code> retournerait finalement une liste [2,3,4]. P>
carte code> avec le Les variables de type remplacées ressembleraient à: p>
Carte :: incrément -> [1,2,3] -> [2,3,4] code> p>
incrément code>, btw, ressemblerait à p>
incrément :: Integer -> Integer code> P>
Si vous prenez l'exemple de
double :: Int -> Int double = (*2)
Les lettres minuscules dans les déclarations de type sont crochet (par exemple, Supports rectangulaires indique une liste de quelque chose. p> donc et produit Nous pouvons décoder Cependant, Haskell peut faire une chose soignée et c'est si vous omettez un argument, il renvoie une fonction qui a la signature restante. Donc disons que nous avons 2 fonctions Lorsque nous écrivons SO Ainsi, le type final sera le suivant: P> a code>, il doit s'agir du même type.
(A -> B) code>) Les subexpressions ont tendance à signifier que la fonction accepte la fonction Une fonction comme l'une de ses paramètres. p>
carte code> accepte ces arguments: p>
(a -> b) code> une fonction qui accepte un argument li>
[a] code> une liste que la première fonction d'argument peut agir sur li>
ul>
[b] code> une liste par conséquent. p>
(.) code> de la même manière:
(a -> b) code> est une fonction qui accepte un seul argument li>
(c -> a) code> est une fonction qui produit la même typa que l'argument à la première fonction li>
c code> un argument du même type que la deuxième fonction utilise li>
ul>
(.) Code> est couramment utilisé pour les fonctions de la chaîne. P>
ORD :: Char -> int code> qui prend un personnage et Retourne sa représentation entier et
add32 :: int -> int code> qui ajoute 32 à son argument. p>
upcaseval = add32. ord code> La fonction UPCASEVAL a maintenant la signature
upcaseval :: char -> int code> car la fonction
(.) code> l'aurait laissé avec
C -> b code> et nous substituons ces dans la définition de la fonction. p>
Plier la carte code> devrait être comme ceci: p>
PlierR code> S Premier argument est une fonction qui prend 2 arguments que
carte code> est. li>
(A -> B -> B code>), nous voyons que dans la carte code>
A = B code> li>
ol>
(b -> b) -> [b] -> [b] -> b -> [b] -> b
Bien que j'aurais pu être confondus avec la carte de la carte code> code> - prenez-la avec un grain de sel.
Le type de Plier de la carte de pliage code> est
[b] -> [b -> b] -> [b] code>
Fonctions dans Haskell Utilisez une notation appelée Currying. Une définition comme signifie que identifiants minuscules dans les signatures de type indiquent un type variable em> qui peut être considérée comme un porte-lieu pour tout type possible. p> la définition p> signifie donc pour tout Types prenons un exemple p> Nous voyons, la liste donnée est une liste de Notre expression renvoie un Pour rendre ces signatures encore plus claires, nous pouvons l'écrire Utilisation d'une syntaxe plus verbeuse p> ceci maintenant indique explicitement Pour les plis, jetez un coup d'œil sur leur Définitions . Compte tenu des connaissances ci-dessus, les signatures de type doivent être auto-expliquées lorsqu'elles sont claires ce que em> les fonctions sont censées faire. P> Exemple: La signature de Vous pouvez également obtenir ceux-ci en tapant simplement plus code> est une fonction qui prend deux
int code> s et renvoie une valeur du type le plus à droite (qui est
int code> à nouveau). Plus en détail, Currying signifie que vous travaillez avec des fonctions partiellement appliquées qui vous permettent d'écrire du code comme p>
A code> et
B code>,
carte code> prend une fonction de
A code> à
B code> et un Liste des
A code> 'S, à partir de laquelle il produit une liste de
B e code>' s em>. p>
int code> 's, donc
a = int code>. En outre,
mappe code> devrait appliquer
Afficher code> à chaque élément, qui renvoie une chaîne
code>. Étant donné que
show code> doit adapter le type
a -> b code> de la définition, nous pouvons déduire que
b = chaîne code>. P>
[b] code>, le résultat est donc un
[string] code>. P>
carte code> est censé fonctionner avec tous les types
A code> et
B code>. P>
factorielle n = FLETL (*) 1 [1..n] code> p>
Plier la carte code> devient. P>
: t pli carte code> dans l'interpréteur Haskell (GHCI). P> P>
Connaissez-vous le concept de currying?
Je crois que c'est le concept de faire des fonctions multi-arguments à prendre seulement 1 argument. quelque chose comme f (x, y) = (f y) o (g x)?
Vous pouvez trouver le type de quelque chose avec la commande T: Thiki dans GHCI (coquille HASKELL interactive): >>: T pli de carte Pluvier carte :: [B] -> [B -> B] -> [B]
Qu'entendez-vous par «Comment définiriez-vous le type inféré de quelque chose ...»? Si vous déclarez le type de quelque chose, il n'a pas besoin d'être déduit.
En passant, il est considéré comme une bonne forme sur le débordement de pile pour accepter des réponses qui donnent une solution correcte. Vous avez posé six questions jusqu'à présent, mais n'a accepté aucune réponse.
@camccann merci pour le conseil. Je ne savais pas ça. Je ferai ça maintenant
Il a également l'effet positif des personnes qui souhaitent vous aider, quand ils ont la chance d'obtenir un morceau de ce gâteau :)
Vous avez tous répondu très bien à la plupart de mes questions, merci! Je suppose que ma seule préoccupation est que quelque chose comme>: T pli de carte pli Plier la carte :: [a] -> [A -> A] -> [a] Comment puis-je déterminer [A] -> [A -> A] - > [a] moi-même (comme sur papier)? J'ai édité la question de la clarté.
@Linda: J'ai édité ma réponse, j'ai un coup d'œil au fond même (Dieu, il est devenu grand)