2 votes

Pourquoi est-ce que j'obtiens `Couldn't match expected type` dans ce code Haskell ?

J'ai une fonction qui fonctionne bien :

      z::Int->Int->[Char]
      z x y =show(x)++show(y)++show(x*y)

Il s'agit simplement d'une fonction qui convertit des chiffres en une chaîne de caractères. Ensuite, je trie la chaîne avec ma fonction de tri rapide.

quicksort.z 2 3

mais ici je reçois l'erreur

Couldn't match expected type `a0 -> [a1]' with actual type `[Char]'
In the return type of a call of `z'
In the second argument of `(.)', namely `z 2 3'
In the expression: flagskib . z 2 3

J'ai essayé des solutions comme les parenthèses et l'utilisation de la fonction $, mais sans succès.

J'apprécie tout commentaire à ce sujet. Le problème est déjà résolu, donc le but de ce post est d'apprendre.

9voto

Sarah Points 3390

quicksort prend un argument. z en prend deux. L'opérateur de composition a le type suivant

(.) :: (b -> c) -> (a -> b) -> a -> c

Vous voyez peut-être le problème maintenant. Les types ne correspondent pas.

quicksort $ z 2 3

Ça marchera. Il en sera de même pour quicksort . z 2 $ 3 ou de manière similaire (quicksort . z 2) 3 car l'application de z à l'argument 2 renvoie une fonction à un seul argument, qui correspond au type de la fonction (.) (application partielle).

6voto

Riccardo Points 6035

Je suppose que quicksort a un type [a] -> [a] . (.) est utilisé pour la composition de fonctions, il s'attend donc à ce que deux fonctions soient composées mais vous utilisez une fonction [Char] à la place. Ce que vous avez écrit est équivalent à \x -> quicksort ((z 2 3) x) ce qui ne fonctionne évidemment pas. Vous devez utiliser ($) au lieu de cela, l'application d'une fonction associative à droite : quicksort $ z 2 3 équivalent à quicksort (z 2 3) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X