Вывод типа F # с рекурсивными функциями и сопоставлением с образцом - PullRequest
0 голосов
/ 27 октября 2018

У меня есть следующий код F #

let Operation (l:int list) =
    let A,B = l.[0], l.[1]
    if A > B then (-)
    else if A%2=0 && B%2=0 then (*)
    else (-)

let m =
    function
    | [] -> []
    | x::rest -> rest

let rec ops (l:int list) (opList:int->int->int list) =
    let operation = Operation l
    if l.Length = 0 then opList
    else ops (m l) (operation::opList)

Компилятор жалуется на последнюю строку, говоря:

Ожидается, что это выражение будет иметь тип 'int -> int -> int list'но здесь имеет тип' 'список'

Он лежит в основе (operation::opList), но операция имеет тип int -> int -> int, а opList имеет тип int->int->int list.Что я тут не так делаю?

1 Ответ

0 голосов
/ 27 октября 2018

Это

int->int->int list

эквивалентно

int->int->(int list)

Это функция двух целочисленных значений, которая возвращает список целых чисел.

Что вы хотите написатьis:

(int->int->int) list

Это список функций двух целых, которые возвращают int.

Итак:

let Operation (l:int list) =
    let A,B = l.[0], l.[1]
    if A > B then (-)
    else if A%2=0 && B%2=0 then (*)
    else (-)

let m =
    function
    | [] -> []
    | x::rest -> rest

let rec ops (l:int list) (opList:(int->int->int) list) =
    let operation = Operation l
    if l.Length = 0 then opList
    else ops (m l) (operation::opList)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...