我写了数据类型和实例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
我遇到了备忘问题! 做某事是不是很容易?
答案 0 :(得分:5)
通过使用unsafePerformIO
隐藏IO
行动中的效果,您有意(并且很可能是非法)进入纯函数领域。在那个领域,它被允许记忆/重构。编译器通常会尝试完全使用纯度,以避免运行时的冗余工作。是否有一个真正的原因可以隐藏杂质,特别是在称为UI
的东西中,人们可以期待与外界(人类)的互动?这可能表明设计不好。您的UI
似乎与Identity
相同,<c:set var="role" value="admin" scope="session" />
是最简单的仿函数,没有任何不纯的效果。