2010-05-28 4 views
1

J'essaie de faire correspondre une expression entière avec des littéraux de caractère, et le compilateur se plaint de l'incompatibilité de type.F # match char values ​​

let rec read file includepath = 
    let ch = ref 0 
    let token = ref 0 
    use stream = File.OpenText file 

    let readch() = 
     ch := stream.Read() 
    let lex() = 
     match !ch with 
     | '!' -> 
      readch() 
     | _ -> token := !ch 

ch doit être un entier parce que ce Stream.Read rendement afin d'utiliser -1 comme marqueur de fin de fichier. Si je remplace '!' par int '!' cela ne fonctionne toujours pas. Quelle est la meilleure façon de faire cela?

Répondre

4
open System.IO 
let rec read file includepath = 
    let ch = ref '0' 
    let token = ref '0' 
    use stream = File.OpenText file 

    let readch() = 
     let val = stream.Read(); 
     if val = -1 then xxx 
     else 
      ch := (char)(val) 
      xxx 
    let lex() = 
     match !ch with 
     | '!' -> 
      readch() 
     | _ -> token := !ch 


    0 

meilleur style:

let rec read file includepath = 
    use stream = File.OpenText file 

    let getch() = 
     let ch = stream.Read() 
     if ch = -1 then None 
     else Some(char ch) 

    let rec getToken() = 
     match getch() with 
      | Some ch -> 
       if ch = '!' then getToken() 
       else ch 
      | None -> 
       failwith "no more chars" //(use your own excepiton) 
+0

qui capte les valeurs de caractère, certes, mais comment faut-il gérer -1 pour la marque de fin de fichier? – rwallace

+0

@juste obtenir la valeur d'abord, puis la conversion de type –

4

Le langage F # n'a pas la conversation implicite entre les types comme ils cassent la composition (si vous déplacez une opération, il change, il est méchant car il n'y aura plus un implicite conversion). Vous pouvez utiliser l'opérateur char pour changer l'int retourné par le courant en char:

open System.IO 
let rec read file includepath = 
    let ch = ref 0 
    let token = ref 0 
    use stream = File.OpenText file 

    let readch() = 
     ch := stream.Read() 
    let lex() = 
     match char !ch with 
     | '!' -> 
      readch() 
     | _ -> token := !ch 
    lex()