在Haskell中解决一个memoization

时间:2017-02-20 13:57:53

标签: haskell memoization

我写了数据类型和实例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

我遇到了备忘问题! 做某事是不是很容易?

1 个答案:

答案 0 :(得分:5)

通过使用unsafePerformIO隐藏IO行动中的效果,您有意(并且很可能是非法)进入纯函数领域。在那个领域,它被允许记忆/重构。编译器通常会尝试完全使用纯度,以避免运行时的冗余工作。是否有一个真正的原因可以隐藏杂质,特别是在称为UI的东西中,人们可以期待与外界(人类)的互动?这可能表明设计不好。您的UI似乎与Identity相同,<c:set var="role" value="admin" scope="session" />是最简单的仿函数,没有任何不纯的效果。