Рассмотрим следующий допустимый код Haskell
module Main where
main :: IO ()
main = do
let x = f
print x
f :: Maybe (Int, Int)
f =
Just 3 >>= (\a ->
Just 5 >>= (\b ->
return (a, b)))
где функция f
может быть эквивалентно переписана с помощью do-нотации, подобной этой
f :: Maybe (Int, Int)
f = do
a <- Just 3
b <- Just 5
return (a, b)
Что меня раздражает, нотация do не будет работать, когда я вставлю содержимое f
в строку. Следующий код даже не анализируется:
main :: IO ()
main = do
let x = do
a <- Just 3
b <- Just 5
return (a, b)
print x
Правильно ли я понимаю, что внутри let
я вынужден прибегать к (>>=)
?
Пока я занимаюсь этим, следующий код также не анализируется:
module Main where
main :: IO ()
main = do
let x =
Just 3 >>= (\a ->
Just 5 >>= (\b ->
return (a, b)))
print x
Я не вижу очевидной причины, кроме ненужной ограниченной мощности let
. Есть ли элегантный способ использовать bind
внутри let
?
in
... - person Willem Van Onsem   schedule 27.11.2015