web-dev-qa-db-fra.com

Je suis vraiment confus au sujet des déclarations de fonction dans Haskell

C'est un devoir, donc je préférerais seulement des conseils ou un lien vers où je peux apprendre plutôt qu'une réponse complète. Voici ce que l'on me donne:

allEqual :: Eq a => a -> a -> a -> Bool

Ce que je comprends de cela, c'est que je suis censé comparer 3 valeurs (dans ce cas a, a, a?) Et retourner si elles sont toutes égales ou non . Voici ce que j'ai essayé:

allEqual :: Eq a => a -> a -> a -> Bool
allEqual x y z do
  Bool check <- x == y
  Bool nextC <- y == z
  if check == nextC
    then True
    else False

Je me sens honnêtement complètement perdu avec Haskell, donc tout conseil sur la façon de lire les fonctions ou de les déclarer serait extrêmement utile.

9
Nico Arevalo
allEqual :: Eq a => a -> a -> a -> Bool

La signature dit: allEqual consomme 3 valeurs de type a; il produit un résultat de type Bool. Le Eq a => part limite les opérations possibles que a peut avoir; il indique quel que soit le type a, il doit satisfaire les exigences définies dans Eq. Vous pouvez trouver ces exigences ici: http://hackage.haskell.org/package/base-4.12.0.0/docs/Prelude.html#t:Eq Vous savez maintenant quelles opérations a peut faire, vous pouvez alors terminer votre fonction en suivant la signature de type.

2
ƛƛƛ

Voici comment procéder:

allEqual :: Eq a => a -> a -> a -> Bool
allEqual x y z = x == y && y == z

Qu'est-ce que ça veut dire?

La première ligne définit la fonction signature de type.

En termes humains, cela dirait quelque chose comme:

Il existe une fonction appelée allEqual pour tout type a. Il nécessite une instance de Eq a * et prend trois paramètres, tous de type a, et renvoie un Bool

La deuxième ligne dit:

La fonction allEqual, pour tous les paramètres x, y et z, doit évaluer x == y && y == z, qui compare simplement que x est égal à y et y est égal à z.

* Les instances ou les classes de types sont une fonctionnalité de langage que peu d'autres langages de programmation ont, donc si vous ne comprenez pas ce qu'elles signifient, je suggérerais d'abord de les connaître.

1
Markus Appel