[Pytanie to jest motywowane rozdziale 9 w "Real World Haskell"]
Oto prosta funkcja (wycięte do zasadniczych):
saferOpenFile path = handle (\_ -> return Nothing) $ do
h <- openFile path ReadMode
return (Just h)
Dlaczego muszę że $
?
Jeśli drugi argument do obsługi nie jest blokiem do, to nie jest potrzebny. Poniższe działa dobrze:
handle (\_ -> putStrLn "Error calculating result") (print x)
Kiedy próbowałem usunięcie kompilację $
powiodło się. mogę zmusić go do pracy, jeśli jawnie dodać nawiasów, czyli
saferOpenFile path = handle (\_ -> return Nothing) (do
h <- openFile path ReadMode
return (Just h))
mogę zrozumieć, ale myślę, że oczekuję, że gdy Haskell uderza do
powinien myśleć „Zaczynam blok” i nie powinniśmy musieć jawnie umieszczać tam $
, aby rozbijać rzeczy.
Myślałem także o popychanie bloku zrobić, aby w następnej linii, tak:
saferOpenFile path = handle (\_ -> return Nothing)
do
h <- openFile path ReadMode
return (Just h)
ale to nie zadziała bez parens albo. Że myli mnie, bo następujących prac:
add a b = a + b
addSeven b = add 7
b
jestem pewien, że będę po prostu dotrzeć do punktu, w którym ja przyjmuję je jako „to, jak piszesz idiomatyczne Haskell”, ale czy ktoś ma żadnych perspektyw, aby dać ? Z góry dziękuję.
Przepraszam, ludzie, nie wiem, stackoverflow bardzo dobrze. Kod jest po prostu kosza. (Dlaczego nie ma "pytania do podglądu"). Spróbuję ponownie go opublikować. – Jonathan
wystarczy nacisnąć przycisk "kod" na pasku narzędzi edytora (wygląda jak para nawiasów klamrowych). Również podgląd znajduje się tuż pod tym, gdzie piszesz, aktualizujesz w czasie rzeczywistym ... – Jon
Ah, NoScript potrzebował zezwolenia na jeszcze jedną domenę! Teraz wygląda dobrze. Dzięki, Jon! – Jonathan