Haskell实际上使用什么机制来决定调用下面的4个操作?
main :: IO ()
main = getLine >>= putStrLn >> getLine >>= putStrLn一开始我以为这和懒惰的评价有关,但是.从真正的单词Haskell,关于IO行动,他们
在执行时产生效果,但在评估时不产生效果
因此,我怀疑这是某种其他机制,而不是希望“评估”main的系统。这个机制是什么?或者,如果是评估,Haskell“想要”什么才能使它执行操作链?
发布于 2017-03-07 20:43:57
作为一阶近似,Haskell程序中唯一的计算源是main。这意味着:
IO操作可以通过>>=、>>、<*>、fmap等进行组装和组合,以生成除main IO操作才能产生效果。从某种意义上说,Haskell程序所做的一切都是运行main :: IO ()。要对任何要评估的内容进行评估,都必须阻止运行IO操作(这正是懒惰的地方)。这就引出了一个问题:实际运行IO操作意味着什么?
在这种情况下,IO的行为就像一个(严格的) State monad,它通过它执行一个RealWorld状态(它不包含任何信息--它是副作用在世界上包含的状态的象征),所以“运行”IO (相当于State RealWorld)就像调用runState。当然,这个runState只能在任何程序中出现一次--而这正是main所做的(以及它的神奇之处)!
发布于 2017-03-07 20:42:09
根据baby的说法,有一种代表真实世界的“假”类型,RealWorld,而IO (a)实际上是一个函数。
type IO a = RealWorld -> (a, RealWorld)因此,正如您在其他语言中可能预期的那样,main实际上是一个函数。
main :: RealWorld -> ((), RealWorld)这在程序运行时被调用。因此,要计算最终输出(类型为((), RealWorld) ),Haskell需要获得RealWorld组件的值,为此,它必须运行main函数。注意:是运行时导致这个函数运行。在Haskell中,无法触发此函数的执行。
在以下情况下
main = getLine >>= putStrLn >> getLine >>= putStrLn每个操作实际上都是函数,为了在最终的RealWorld结束时计算出putStrLn值输出,它需要运行它,以及导致它的所有操作。
因此,它是懒惰的评估,但隐藏的RealWorld值。
https://stackoverflow.com/questions/42657529
复制相似问题