Комментарии 7
Это не косяк. Так как F# должен обеспечивать взаимодействие с кодом на других .NET языках, которые кишат побочными эффектами, то использование ленивых вычислений по умолчанию весьма затруднено.
Есть явная ленивость:
let lazyValue = lazy (2 * 2)
let value = Lazy.force lazyValue
В strict языках Y-комбинатор формулируется по-другому — он принимает как аргумент не функцию a → a, а функцию (a → b) → (a → b):
let rec y f = f (fun x -> (y f) x)
let fib = y (fun f -> function
| 0 -> 0
| 1 -> 1
| n -> f (n — 1) + f (n — 2))
printfn "%i" (fib x)
Есть явная ленивость:
let lazyValue = lazy (2 * 2)
let value = Lazy.force lazyValue
В strict языках Y-комбинатор формулируется по-другому — он принимает как аргумент не функцию a → a, а функцию (a → b) → (a → b):
let rec y f = f (fun x -> (y f) x)
let fib = y (fun f -> function
| 0 -> 0
| 1 -> 1
| n -> f (n — 1) + f (n — 2))
printfn "%i" (fib x)
У меня была идея передавать в каждую итерацию лямбду, содержащую продолжение; собственно, так и выглядела Лисп-версия Ы-комбинатора.
К Ф-Шарпу я пришел из Хаскеля, который ленив настолько, что его приходится заставлять вообще что-то считать :)
Вот вопрос — а Nemerle тоже активный?
К Ф-Шарпу я пришел из Хаскеля, который ленив настолько, что его приходится заставлять вообще что-то считать :)
Вот вопрос — а Nemerle тоже активный?
разве F# ленивый язык? о_О
он же активный
он же активный
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
F# не ленится :(