Игнорируя классы типов, у нас есть следующие типы в Haskell (мы будем говорить, что наличие правильных классов типов Haskell соответствует подходящему методу .then
в JavaScript):
fmap :: (a -> b) -> f a -> f b
bind :: (a -> f b) -> f a -> f b
А в JavaScript у нас есть (составленный синтаксис):
.then :: (this :: f a) -> (a -> (b || f b)) -> f b
Так что в одном смысле они эквивалентны, а в другом нет. Например, предположим, что в Haskell существует тип обещания P
, и мы хотим прочитать URL-адрес из файла, а затем дать обещание получить этот URL:
read :: String -> P String
fetch :: String -> P String
readFetch :: String -> P (P String)
readFetch file = fmap fetch (read file)
А потом вы могли бы do
:
fetched <- readFetch someFile
...
foo <- fetched
Находясь в JavaScript, если вы сделали read(file).then(fetch)
, это будет эквивалентно следующему Haskell:
readFetch :: String -> P String
readFetch file = bind fetch (read file)
Таким образом, первое становится выполненным только после чтения файла, а второе - после завершения выборки (т.е. позже).
Мы заключаем, что then
похож, но не точно так же, как fmap
.