Urządzenie zawiera tajemniczą, nieudokumentowaną funkcję fixIO
. Its source tylko dodaje do tajemnicy:Co robi fixIO?
fixIO :: (a -> IO a) -> IO a
fixIO k = do
m <- newEmptyMVar
ans <- unsafeInterleaveIO (takeMVar m)
result <- k ans
putMVar m result
return result
Wydaje się to zrobić moralnym odpowiednikiem dereferencing NULL (odczyt z pustym MVar). Rzeczywiście, próbując go:
import System.IO
main = fixIO $ \x -> putStrLn x >> return x
wyniki w błąd „gwint zablokowane na czas nieokreślony w MVar operacji”
Wyszukany okazuje się nic zaoszczędzić 15 year old message Simon sam Peyton-Jones, w którym świadczy on powyższą źródło i ma nadzieję, że sprawi, że znaczenie będzie jasne (a jednak jestem).
Czy ktoś może rzucić trochę światła na to? Co robi FixIO i kiedy powinienem go używać?
'fix' nie ma nic wspólnego z brakiem zachowania całej sekwencji fibonacci. "niech kłamstwa = 1: 1: zip z (+) kłamstwami (kłamstwo ogona) w kłamstwach !! 9 "będzie równie dobrze. –
Tom Ellis: Jestem na moim telefonie, ale uważam, że definicja poprawki to 'fix f = let a = f a in a', więc masz rację, to nie jest konieczne. ale jest to równoważne. – rampion
Może również być bardziej zwięzły: 'fix (1:)' jest krótszy niż 'let x = 1: x in x'. – rampion