У меня есть конструктор данных с несколькими конструкторами значений:
data DataType = C1 | C2 | C3 | ... | Cn
Я хотел бы построить функцию во время выполнения из этого типа данных в некоторые другие значения (фактически, я делаю это в монаде IO):
buildFun :: IO (DataType -> b)
buildFun = do
....
return $ \x -> case x of
C1 -> someProcessesToGetTheValue C1
...
Cn -> someProcessesToGetTheValue Cn
Будет ли это означать, что someProcessesToGetTheValue будет вызываться каждый раз, когда я вызываю возвращаемую функцию?
Я бы предпочел, чтобы Haskell оценил someProcessesToGetTheValue внутри buildFun (поскольку эти вызовы довольно дороги) и вернул функцию, которая возвращает эти полностью вычисленные выражения.
Могу ли я заставить это поведение? Возможно, сделав что-то вроде следующего?:
buildFun :: IO (DataType -> b)
buildFun = do
C1value <- return $ someProcessesToGetTheValue C1
...
Cnvalue <- return $ someProcessesToGetTheValue Cn
return $ \x -> case x of
C1 -> C1value
...
Cn -> Cnvalue