J'écris une bibliothèque pour gérer des images simples en ML Standard. Il devrait supporter différents types utilisés comme couleur pour chaque pixel, par ex. bool, Word8.word, etc.SML utilise abstype avec des signatures
J'ai un abstype 'a image
avec toutes les fonctions communes définies indépendamment de la représentation ('a
est la représentation des couleurs), mais les formats de sortie sont différents, donc je voudrais avoir différentes structures.
Existe-t-il un moyen d '"ouvrir" un abstype
à l'intérieur d'une structure? Je ne peux obtenir ce travail d'une manière très laid:
abstype 'clr absimage = Image of {width : int, height : int, data : 'clr array array}
with
fun createFunc (w, h) f = Image {width = w, height = h, data = ...}
fun createBlank (w, h) clr = createFunc (w, h) (fn _ => clr)
...
end
signature IMAGE = sig
type colour
type image
val createFunc : (int * int) -> (int * int -> colour) -> image
val createBlank : (int * int) -> colour -> image
...
val toBinPPM : image -> string -> unit
end
functor ImageFn(C : sig type colour end) = struct
open C
type image = colour absimage
val createFunc = createFunc
val createBlank = createBlank
...
end
structure Image8 :> IMAGE = struct
structure T = ImageFn(struct type colour = Word8.word end)
open T
fun toBinPPM img filename = ...
end
En particulier, la définition du foncteur oblige à écrire des déclarations comme val name = name
pour toutes les fonctions définies dans la partie with ... end
de abstype
.
Ou est-ce que mon approche est complètement fausse?
Cette combinaison de abstype
et signature
est ma tentative de recréer classe abstraite de OOP avec des méthodes communes de abstype
et nécessitent la mise en œuvre d'autres méthodes dans toutes les structures utilisant la signature
post-scriptum Pourquoi SML n'autorise pas les instructions telles que open (ImageFn(struct ... end))
et force l'utilisation d'une structure temporaire (T
dans le code ci-dessus)?
Merci beaucoup! Je n'ai pas réalisé que vous pourriez utiliser ':>' avec des foncteurs. Déclarer l'image en tant que type de données est juste quelque chose qui reste de l'ancienne implémentation qui m'a été imposée par une tâche unidentique – zlotnleo