2017-09-16 3 views
2

Étude des premiers principes de Haskell. Débutant absolu à Haskell. Si :Types définis par Haskell

data A 
data B 
func :: A -> B 
func = undefined 

Qu'est-ce que la fonction réelle est? J'ai travaillé avec beaucoup d'exercices avec un bon résultat (merci aussi à vous) mais encore une fois je suis coincé. Est-ce que A -> B indique deux types différents comme 'String' -> 'Char'? J'essaye juste d'envelopper ma tête autour d'elle.

+0

Aucun type de majuscule n'est un type réel. Alors que les types en minuscules sont des variables de type. –

+0

Si c'est le code actuel, alors 'undefined' est, dans un sens, la seule définition valide de' func'. 'B' n'est pas habité, il n'y a donc aucun moyen de renvoyer la valeur de' B' de 'func'. (D'ailleurs, il n'y a aucun moyen d'appeler 'func' non plus, car il n'y a pas de valeurs de' A' à fournir en argument.) – chepner

Répondre

5

Non, (béton) les types commencent par une majuscule. Alors A -> B signifie que les types A et B vous avez défini (bien non définie ici) avec vos data A = ... expressions, comme par exemple:

data A = Foo | Bar Int | Qux String A 

Dans le cas où la signature contient un identifiant avec un minuscule, il est un tapez la variable. Par exemple foo :: a -> b, les moyens a et b peuvent être substitués par n'importe quel type. Donc foo est une fonction qui peut être A -> B, mais aussi A -> Int, Char -> B, et Char -> Int.

Vous pouvez également ajouter des contraintes de type à la signature de limiter les types pour lesquels, par exemple, a et b peuvent être utilisés. Comme foo :: (Show a, Num b) => a -> b restreint a et b, tel qu'il doit exister un instance Show a et instance Num b pour les types a et b de telle sorte que foo est défini sur ces types.

-1

Merci Willem, Chepner. Vos réponses me ont aidé à évoquer:

data A 
data B 
funcAJ :: A -> B 
funcAJ a = a 
     where a = b 
      b = undefined 

Ce typable comme funcAJ :: A -> B, que je comprends. Merci beaucoup!

+2

Cela ne fonctionne pas comme vous le pensez probablement. Le 'a' dans' where' ombrage le paramètre de fonction 'a'. Ce sont des variables différentes avec le même nom. Le 'a' qui est le paramètre de la fonction est de type' A', alors que celui défini dans 'where' et retourné par la fonction est de type' B'. C'est parce qu'il est défini pour évaluer à 'b' qui est à son tour défini comme' undefined'. Et indéfini peut prendre (à peu près) n'importe quel type. Donc, c'est juste une façon élégante d'écrire 'funcAJ a = undefined'. – Potato44

+0

Ok. Merci, mais j'avais de grands espoirs que j'ai compris. Je suis perdu maintenant. Pouvez-vous poser une fonction qui vérifie le type et est correcte? – Madderote

+0

À moins que vous ne donniez vos types 'A' et' B', certains constructeurs de données 'undefined' (ou d'autres constructions qui retournent en bas) sont la seule implémentation possible pour une fonction de type' A -> B'. – Potato44