Во время отладки функции запоминания я обнаружил, что пытаюсь выяснить, действительно ли Seq.mapi
повторяет последовательность, поэтому я заменил анонимную функцию вызовом printfn
следующим образом:
let x = "test" |> Seq.map (fun c -> c |> printfn "%c")
К моему удивлению, побочный эффект печати на консоль никогда не возникал, в FSI он просто возвращал val d : seq<unit>
. Хотя этот результат верен, я ожидал, что побочный эффект сработает, когда функция map
перебирает последовательность. То есть, когда я заменяю его на Seq.map id
, он работает как положено и возвращается сам.
Когда я заменяю Seq.map
или Seq.mapi
на Seq.iter
или Seq.iteri
, побочный эффект действительно печатается.
Теперь я думаю, что это связано с ленивым вычислением последовательности и тем, что F# внутри либо создает последовательность замыканий, либо вообще ничего не делает, пока не будет вызван, потому что, если я сделаю Seq.last d
, это выводит все элементы последовательности.
for item in x do ()
, которая заставит его оценивать элементы (и выводить вывод на консоль). - person Adam Kewley   schedule 04.05.2015let x = "test" |> Seq.map (fun c -> c |> printfn "%c"; (char (int c + 1)).ToString())
; тогда этоlet y = String.concat "" x
- person phoog   schedule 04.05.2015