data S = Sa Int
type PMO = StateT Int (ErrorT String IO)
cs :: S -> PMO ()
cs _ = do
mem <- get -- (*)
return ()我用(*)突出了这一行。我怀疑为什么可以调用get函数。我知道get是State monad中的函数,但我无法理解它是如何知道实际上存在这样的monad的。我看到返回的类型是PMO,但它只是返回值。它与get有什么共同之处?
主要是,我有命令式语言编程的经验,所以我很难理解它。
发布于 2016-10-28 22:29:48
检查get的类型
get :: MonadState s m => m s因为在cs的类型签名中,您已经告诉编译器什么是m,所以get变成了:
get :: StateT Int (ErrorT String IO) Int那只是一个一元值,而不是函数。那么,名为mem的值来自何处?最终,get提供的值来自runStateT (或execStateT或evalStateT)提供的初始状态值。
如果这看起来仍然神秘的话,我建议你研究一下国家单曲是如何运作的。
https://stackoverflow.com/questions/40313812
复制相似问题