2017-01-25 2 views
1

J'essaie de développer un module qui effectue différents algorithmes sur un ensemble d'états en recevant les fonctions pour les gérer en tant que paramètres. Je définissais différents alias de type pour le rendre plus facile à implémenter; un exemple simple pour comprendre ce serait:Haskell Type Classes dans la déclaration Type Alias ​​

-- Function that expands a state 
type Expand = State -> State 
-- Function that evaluates a state 
type Eval = State -> Float 
-- Group of states 
type Tree = [State] 

Et puis j'ai réalisé que je voulais State être l'alias d'un type qui est assimilables: Je ne me soucie pas si les états de l'utilisateur sont (Int, Int), Float, ou String tant qu'il lui est possible de mettre en œuvre les fonctions Expand et Eval et de comparer deux états différents.

Comment puis-je généraliser le type State pour y parvenir? La chose intuitive qui vient à l'esprit est quelque chose comme type State = (Eq a) => a mais ce n'est évidemment pas possible sans un a dans la portée. Y at-il un moyen facile pour moi de déclarer des fonctions qui traitent State comme une boîte noire?

Répondre

4

Vous devez inclure l'état générique en tant que paramètre de type.

type Expand s = s -> s 
type Eval s = s -> Float 
type Tree s = [s] 

Il est impossible de le masquer complètement, car par ex. Expand pour un état (Int, Int) est un type complètement différent que pour un état String. Pour la contrainte Eq. Généralement, vous incluez cette valeur localement uniquement dans la fonction spécifique qui requiert la contrainte.