f = do
let off = getOff >>= computeOffset
getOff :: M Int
computeOffset :: Int -> Int
M
является монадой.Связывание двух функций. Альтернативный синтаксис
Это не выглядит красиво. Могу ли я улучшить его с помощью синтаксиса сахара?
f = do
let off = getOff >>= computeOffset
getOff :: M Int
computeOffset :: Int -> Int
M
является монадой.Связывание двух функций. Альтернативный синтаксис
Это не выглядит красиво. Могу ли я улучшить его с помощью синтаксиса сахара?
Расширение в do
синтаксис может быть сделано следующим образом, начиная с:
getOff >>= computeOffset
Существует параметр передается в computeOffset
, которая скрыта. Это может помочь, чтобы показать, как это выглядит явно перед выходом на do
синтаксис:
getOff >>= \off -> computeOffset off
Теперь вы можете написать синтаксис do
принимая off
в первой строке, а затем использовать его во втором.
do
off <- getOff
computOffset off
Если computeOffset
имеет типа Int -> Int
, и что вы хотите, чтобы отобразить его в результате getOff
, вы можете использовать fmap
:
f :: M Int
f = fmap computeOffset getOff
... или, в качестве альтернативы, с аппликативной нотацией (почти то же самое)
f :: M Int
f = computeOffset <$> getOff
(1) Ваш блок блокировки недействителен, так как он заканчивается линией 'let'. Кроме того, с типами, которые вы упомянули, 'getOff >> = computeOffset' не будет проверяться typecheck. Вы должны исправить эти проблемы, чтобы получить больше предложений относительно того, что вы на самом деле пытаетесь сделать. (2) Тем не менее, возможно, вы просто ищете 'f = getOff >> = computeOffset', который вообще не содержит никакого сахара. – duplode