0
我写了数据类型和实例Monad类。下面是我的源代码:解决Haskell中的记忆问题
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'实例MonadIO UI,其中 liftIO a =返回$ unsafePerformIO a' – QSpider
您如何期待memoization来应对IO操作的状态? – jakubdaniel
如果有人滥用'unsafePerformIO',将不会有什么保证:这就是为什么它是不安全的!只有当你不关心什么时候或者如果IO被触发时才能安全地使用它。为什么不直接使用'IO' monad呢?你甚至可以包装它,如果你想作为'newtype UI a = UI {unUI :: IO a}'并且围绕它定义你的实例。 – chi