W Haskell, następujące drukuje kod "[1,2,3,4,5":Ekspresja chętna w Frege, ale leniwa w Haskell?
foo = take 10 $ show $ numbersFrom 1 where
numbersFrom start = start : numbersFrom (start + 1) -- could use [1..]
Ale w Frege, rzuca OutOfMemoryError
z następującego kodu:
foo = take 10 $ unpacked $ show $ numbersFrom 1 where
numbersFrom start = start : numbersFrom (start + 1)
Tutaj jedyną różnicą jest funkcja unpacked
, która jest niezbędna do konwersji z String
na [Char]
, a funkcja FWIW, funkcja unpacked
jest gorliwa. Dlaczego całe wyrażenie nie może być leniwy, jak w Haskell? Czy jest możliwe osiągnięcie czegoś podobnego do Haskella w Frege?
Łańcuchy w języku FREGE nie są listami. Więc 'take 10' nie może być zastosowane do wyniku' show'. Dlatego "unpacked" jest używane do pierwszej konwersji z 'String' na' [Char] ', a następnie' take 10' jest stosowane na liście. –
Więc czym są 'String's w Frege? Wygląda na to, że są to 'java.lang.String' (zobacz definicję języka Frege). Nigdy nie dostaniesz się do oceny "rozpakuj", ponieważ nigdy nie będzie w stanie zbudować struny! –