Ленивость в окамле
Aug. 13th, 2013 04:17 pmutop[0]> open Core.Std;; utop[1]> let a = lazy (printf "A\n"; 0);; val a : int lazy_t = <lazy> utop[2]> let b (a : int) = lazy (printf "B\n"; 0);; val b : int -> int lazy_t = <fun> utop[3]> Lazy.force Lazy.(a >>= b);; A B - : int = 0
Ну ё-моё...
no subject
Date: 2013-08-13 01:25 pm (UTC)no subject
Date: 2013-08-13 01:29 pm (UTC)aвообще вычисляется? Оно для результата не нужно нафиг.no subject
Date: 2013-08-13 01:54 pm (UTC)a = do
print "A"
return 0
b x = do
print "B"
return 0
main = a >>= b
$ ./Proba01
"A"
"B"
no subject
Date: 2013-08-13 03:49 pm (UTC)a = trace "A" 0и далее аналогично.no subject
Date: 2013-08-13 02:56 pm (UTC)no subject
Date: 2013-08-13 03:53 pm (UTC)lazy xнадо будет писатьlazy (fun _ -> x).no subject
Date: 2013-08-13 04:12 pm (UTC)Мне в окамле слово lazy за 5 лет лишь один раз пригодилось. Там, где в хаскеле используют ленивые списки, в окамле обычно хватает Enum'ов. В остальном просто стиль работы другой, энергичный. Потому особой нужды в ленивости и не чувствуется. Пытаться из окамла изобразить хаскель, делая все ленивым, - плохая затея.
no subject
Date: 2013-08-13 05:02 pm (UTC)no subject
Date: 2013-08-13 05:28 pm (UTC)В этом плане в Википедии засилие учоных - см. http://nponeccop.livejournal.com/333219.html?thread=3079331#t3079331
no subject
Date: 2013-08-13 04:15 pm (UTC)Это call by name, не ленивость, тут будет многократное исполнение при многократном обращении.
no subject
Date: 2013-08-13 04:50 pm (UTC)А второй компонент call by need - sharing - сам окамл делает безо всяких усилий с нашей стороны.
no subject
Date: 2013-08-13 05:09 pm (UTC)no subject
Date: 2013-08-13 05:22 pm (UTC)no subject
Date: 2013-08-13 05:27 pm (UTC)no subject
Date: 2013-08-13 05:29 pm (UTC)no subject
Date: 2013-08-13 06:04 pm (UTC)no subject
Date: 2013-08-13 06:05 pm (UTC)no subject
Date: 2013-08-13 04:54 pm (UTC)type 'a lazy_inside = Ready of 'a | Postponed of (() -> 'a) type 'a lazy_t = 'a lazy_inside ref lazy f = ref (Postponed f) force r = match !r with | Ready x -> x | Postponed f -> let x = f () in r := Ready x; x (>>=) r f = lazy (fun _ -> force (f (force x)))no subject
Date: 2013-08-13 05:08 pm (UTC)