Consiglio vivamente di leggere il capitolo Desugaring of Do-blocks nel libro "Real-World haskell". Ti dice che hai tutti torto. Per un programmatore, è il modo naturale di utilizzare una lambda, ma il blocco di esecuzione viene implementato utilizzando funzioni che, se si verifica un errore di pattern maching, chiameranno l'implementazione fail
della monade corrispondente.
Per esempio, il caso è come:
let f x =
putStrLn "enter second line" >>
let g y = return (x,y)
g _ = fail "Pattern mismatched"
in getLine >>= g
f _ = fail "Pattern mismatched"
in getLine >>= f
In un caso come questo, questo può essere del tutto irrilevante. Ma considera alcune espressioni che coinvolgono la corrispondenza del modello.Inoltre, è possibile utilizzare questo effetto per alcune cose particolari, per esempio, si può fare qualcosa di simile:
oddFunction :: Integral a => [a] -> [a]
oddFunctiond list = do
(True,y) <- zip (map odd list) list
return y
Quale sarà questa funzione fare? Puoi leggere questa dichiarazione come regola per lavorare con gli elementi della lista. La prima istruzione lega un elemento della lista al var y, ma solo se y è dispari. Se y è pari, si verifica un errore di corrispondenza del modello e verrà chiamato fail
. Nell'istanza monad per Elenchi, fail
è semplicemente []
. Pertanto, la funzione rimuove tutti gli elementi pari dalla lista.
(lo so, oddFunction = filter odd
farebbe questo meglio, ma questo è solo un esempio)
Il primo esempio potrebbe essere molto più naturale scritto come 'GetLine >> = putStrLn'. La notazione è piuttosto scomoda lì. – Chuck