Chcę zrobić w Haskell coś, co wygląda tak:
main1 = do s <- getLine
if s == "foo" then putStr "You entered foo"
Oczywiście nie jest to legalne, ponieważ nie ma else
. Jedna alternatywa, o której myślałem:
nop :: IO ()
nop = sequence_ []
main2 = do s <- getLine
if s == "foo" then putStr "You entered foo" else nop
To jest trochę rozwlekłe, ale w razie potrzeby zgodziłbym się na to. Byłbym zaskoczony, gdyby nie było wbudowanej wersji programu nop
.
Alternatywnie:
doIf :: Bool -> IO () -> IO ()
doIf b m = if b then m else nop
main3 = do s <- getLine
doIf (s == "foo") (putStr "You entered foo")
Jest to bardziej zwięzłe, ale składnia nie jest szczególnie ładna. Ponownie, nie zdziwiłbym się, gdybym znalazł coś wbudowanego, co już istnieje.
Jaki jest preferowany sposób zrobienia tego?
return
w Haskell nie jest konstrukcją językową, to tylko funkcja (o źle dobranej nazwie, jak mówi bdonian). Return nie wpływa na przepływ sterowania, czy coś takiego, co możesz napisać:do {s <- getLine; return (); putStrLn s}
to by się wykonało dobrze.Not in scope: `when'
zatest = do (when True (putStrLn "Hello"))
.when
wymagaimport Control.Monad
na początku pliku.Można użyć Hoogle znaleźć funkcje, w tym przypadku:
when
.W Hoogle możesz wprowadzić sygnaturę typu i spróbuje znaleźć pasujące funkcje w standardowych bibliotekach, ujednolicając typy i zmieniając kolejność argumentów.
W twoim przypadku możesz po prostu wpisać typ swojej
doIf
funkcji: Bool -> IO () -> IO () .when
jest trzecia odpowiedź tutaj, jej odwrotnośćunless
jest również tam.źródło