F # соответствует значениям char - PullRequest
1 голос
/ 28 мая 2010

Я пытаюсь сопоставить целочисленное выражение с символьными литералами, и компилятор жалуется на несовпадение типов.

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 должен быть int, потому что это то, что возвращает stream.Read, чтобы использовать -1 в качестве маркера конца файла. Если я заменю '!' на int '!', он все равно не будет работать. Какой лучший способ сделать это?

Ответы [ 2 ]

4 голосов
/ 28 мая 2010

Язык F # не имеет неявного диалога между типами, поскольку они нарушают композицию (т. Е. Если вы перемещаете операцию, она меняет свое значение, поскольку не будет больше неявного преобразования). Вы можете использовать оператор char, чтобы изменить int, возвращаемый потоком, на 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()
4 голосов
/ 28 мая 2010
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

лучший стиль:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...