2012-04-24 24 views
24

Zauważyłem, że Data.UnionFind używa monopolu IO, aby zapewnić wskaźniki za pośrednictwem IORefs. Wyobrażam sobie, wszyscy szczęśliwie nazywają unsafePerformIO, gdy używają go lokalnie w czystym kodzie, ponieważ struktura danych jest tak dobrze zrozumiała, ale ..Unikanie IORefs w czystym kodzie

Czy istnieje kanoniczne czystsze podejście do takich struktur danych? Być może otoki wokół IO powodują, że nieuniknione jest, że "szukanie" jest mniej niebezpieczne, przez zabronienie większości operacji IO?

+0

Uważam, że pakiet jest przeznaczony do użytku w Monadzie IO. Większość Haskellerów pozostaje tak daleko od "unsafePerformIO", jak to tylko możliwe. –

Odpowiedz

30

Czy istnieje kanoniczne czystsze podejście do takich struktur danych? Być może owijka wokół IO, która sprawia, że ​​nieuchronna niepewnośćPerformIO jest mniej niebezpieczna "patrząc", zabraniając większości operacji IO?

Tak, właśnie. Właśnie wymyśliłeś the ST monad, wprowadzony przez Launchbury and Peyton Jones około 20 lat temu.

Monada o nazwie ST zezwala tylko na efekty pamięci o zasięgu lokalnym. Jest to niezwykłe, ponieważ wykorzystuje system typu, aby zagwarantować, że efekty uboczne nie są widoczne poza zakresem bloku kodu, który je wykorzystuje.

Tak, tak długo, jak korzystać z pamięci tylko poprzez referencje, jedynie w zakresie lokalnym, można uniknąć unsafePerformIO i używać czystej ST zamiast, na przykład, do implement union-find.

+0

Ahh, nie zdawałem sobie sprawy, że ST ma wewnętrzne referencje, dziękuję. –

+0

Powyższy link '' 'Monad'''' jest uszkodzony. Oto aktualny: http://hackage.haskell.org/package/base-4.9.1.0/docs/Control-Monad-ST.html –