f # генерирует следующую функцию значения - PullRequest
1 голос
/ 27 октября 2019

Учитывая список [1, 2] Я пытаюсь создать анонимную функцию, которая генерирует кортеж (следующее значение * функция, которая генерирует следующее значение) ... что-то вроде

f = createFunc([1; 2])
(v1, f1)  = f()    //v1 = Some 1
(v2, f2)  = f1()   //v2 = Some 2
(v3, f3)  = f2()   //v3 = None

Я могу сделать это достаточно легко в Эликсире, но я бьюсь головой о стену в F #. Любые указатели с благодарностью получили. Моя попытка пока выглядит так:

let top_and_tail (l: list<'a>): (Option<'a> * list<'a>) = 
    match l with
        | [] -> (None, [])
        | h :: t -> ((Some h), t)


let rec createFun l = 
    fun() -> 
        let (h, t) = top_and_tail(l)
        (h, createFun(t))

1 Ответ

0 голосов
/ 28 октября 2019

Попробуйте добавить аннотацию типа к сигнатуре вашей функции. Тип возвращаемого значения зависит от длины l. Вы можете обойти это, определив рекурсивный тип:

data Ret a = 
| End of a
| KeepGoing of a * (unit -> Ret a)
...