2 votes

Mettre un ()->int dans un type F#

J'ai une application qui utilise un service (générique) pour effectuer des actions IO. Je souhaite regrouper les fonctions IO habituelles (Save, SaveAs, etc.) dans un type F#, mais le compilateur ne semble pas apprécier cette notation :

type InputService<'a> = {
    // Fine
    SomeFunc : 'a -> Option<'a>

    // Error (VS2012): "Anonymous type variables are not permitted in this declaration"
    Save : 'a -> ()

    // Error (see above)
    Load : () -> 'a
}

Je suis conscient que les fonctions avec état comme celle-ci peuvent ne pas être idiomatiques. En réalité, j'ai l'intention d'intégrer les invites de l'interface utilisateur, les chemins d'accès aux fichiers, etc. mais est-il possible de définir la signature de cette fonction dans mon type ?

8voto

John Palmer Points 14866

Il semble que dans cette notation, il faille écrire

type InputService<'a> = {
    SomeFunc : 'a -> Option<'a>  
    Save : 'a -> unit
    Load : unit -> 'a
}

c'est-à-dire écrire unité au lieu de ()

Vous pouvez voir un exemple plus simple ici

let t : () = ();;

produit le même message d'erreur, mais l'écriture unit fonctionne bien.

La raison de ces messages d'erreur est que () est une constante comme 1 . Il est évident que vous ne pouvez pas écrire

let t : 1 = 1;;

Il en va de même pour ()

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