2016-12-21 3 views
0
f = do 
    let off = getOff >>= computeOffset 

getOff :: M Int 
    computeOffset :: Int -> Int 

M является монадой.Связывание двух функций. Альтернативный синтаксис

Это не выглядит красиво. Могу ли я улучшить его с помощью синтаксиса сахара?

+9

(1) Ваш блок блокировки недействителен, так как он заканчивается линией 'let'. Кроме того, с типами, которые вы упомянули, 'getOff >> = computeOffset' не будет проверяться typecheck. Вы должны исправить эти проблемы, чтобы получить больше предложений относительно того, что вы на самом деле пытаетесь сделать. (2) Тем не менее, возможно, вы просто ищете 'f = getOff >> = computeOffset', который вообще не содержит никакого сахара. – duplode

ответ

1

Расширение в do синтаксис может быть сделано следующим образом, начиная с:

getOff >>= computeOffset 

Существует параметр передается в computeOffset, которая скрыта. Это может помочь, чтобы показать, как это выглядит явно перед выходом на do синтаксис:

getOff >>= \off -> computeOffset off 

Теперь вы можете написать синтаксис do принимая off в первой строке, а затем использовать его во втором.

do 
    off <- getOff 
    computOffset off 
0

Если computeOffset имеет типа Int -> Int, и что вы хотите, чтобы отобразить его в результате getOff, вы можете использовать fmap:

f :: M Int 
f = fmap computeOffset getOff 

... или, в качестве альтернативы, с аппликативной нотацией (почти то же самое)

f :: M Int 
f = computeOffset <$> getOff 
Смежные вопросы