Не удается получить типы для соответствия в функциях F # - PullRequest
1 голос
/ 08 апреля 2019

Я пытаюсь преобразовать строку в список типов римских цифр.Но я не понимаю, как работает seq.map.

Изменение типов в charromdig.

let charRomDig c:RomDig = 
    match c with
        | "I" -> I
        | "V" -> V
        | "X" -> X
        | _ -> I

let toUpper (s:string) = 
    s.ToUpper()

let strToRom (str:string): RomNum = 
    let res = toUpper str
    let xTimes2 =
    res
    |> Seq.map(charRomDig)
    romL

let res = strToRom "XI"

Я хочу, чтобы он успешно отображал список преобразованных римских цифр.

Но я получаю следующее:

'char -> 'a'
but given a
    'string -> RomDig'
The type 'char' does not match the type 'string'

1 Ответ

1 голос
/ 08 апреля 2019

Похоже, ваш Seq.map ожидает символ RomDig, но вместо этого получает функцию, которая возвращает строку в romDig. Это звучит правильно, потому что похоже, что ваша карта отображает строки в RomDig. В будущем обязательно включите определения типов, так как это значительно облегчит вам задачу. Здесь, в charRomDig, я заметил, что ваши совпадения - это «I», «V» и «X» вместо «I», «V» и «X». Когда вы рассматриваете строку как последовательность отдельных символов, совпадение также должно быть символами.

type RomDig = I | V | X 
type RomNum = RomDig seq //equivalent to seq<RomDig> 
let charRomDig c:RomDig = match c with | 'I' -> I | 'V' -> V | 'X' -> X | _ -> I
let strToRom (str:string): RomNum = 
    let xTimes2 = str |> Seq.map(charRomDig)
    xTimes2

let XI = strToRom "XI"
...