Bu, Haskell'i ilk denediğimde beni şaşırtan zor küçük şeylerden biridir. Açıklamada <-
yapısının anlamını yanlış anlıyorsunuz. result <- f handle
"f handle
değerini result
olarak atama" anlamına gelmez; "f handle
monadik değerinden" ayıklanan "değerine" result
10 "bağlamanız gerekir (burada" ayıklama ", kullandığınız belirli Monad örneğiyle tanımlanan bir şekilde gerçekleşir, bu durumda IO monad).
yanı, bir Monad typeclass m, <-
ifadesi sağından tip m a
bir ifade ile sol taraftaki tip a
bir değişken alan ve bir değere değişken bağlanır. Böylece, örneğinizde, result <- f handle
ile f result :: IO a
, result :: a
ve return result :: IO a
türlerine sahibiz.
PS do-notation, <-
'a tam bir karşılık olarak çalışan let
(bu durumda in
anahtar sözcüğü olmadan) özel bir biçime sahiptir. Yani olarak örnek yazabilirsiniz: let
basit atama, çünkü bu durumda
withFile' :: FilePath -> IOMode -> (Handle -> IO a) -> IO a
withFile' path mode f = do
handle <- openFile path mode
let result = f handle
hClose handle
result
, result
tipi IO a
olduğunu.
Oh d'oh! Tamamen _sucking_ '<-' operatörünü kaçırdı! – drozzy
Ayrıca 'sonuç = f tutabilirsiniz; hClose kolu; sonuç ya da tekrar monad anlayışını bozmadım mı? – delnan
@delnan, {handle <- openFile modu yolu; hClose kolu; f kolu; } ', yani' f tutamaç 'muhtemelen kapalı bir sap hakkında şikâyet ederdi. –