【发布时间】:2017-02-20 13:57:53
【问题描述】:
我写了数据类型和实例 Monad 类。以下是我的源代码:
data UI a = UI { unUI :: a }
deriving Functor
instance Applicative UI where
pure = UI
m *> k = m >>= \ _ -> k
m <* k = m >>= \ _ -> m
m <*> k = UI $ (unUI m) (unUI k)
instance Monad UI where
m >> k = m >>= \ _ -> k
m >>= k = k $ unUI m
return = UI
但是,当我使用如下功能时:
generateUUID :: UI String
generateUUID = do
ruuid <- liftIO $ UV4.nextRandom
return $ UV.toString ruuid
我遇到了记忆问题! 可以做点什么吗?
【问题讨论】:
-
对于 MonadIO
instance MonadIO UI where liftIO a = return $ unsafePerformIO a -
您希望 memoization 如何处理
IO动作的状态性? -
无法保证如果滥用
unsafePerformIO会发生什么:这就是它不安全的原因!只有当您不关心 IO 何时或是否被触发时,才能安全地使用它。为什么不直接使用IOmonad 呢?你甚至可以将它包装成newtype UI a = UI { unUI :: IO a }并围绕它定义你的实例。
标签: haskell memoization