内容简介:代码日志版权声明:翻译自:http://stackoverflow.com/questions/37846161/haskell-program-aborts-with-loop-but-i-think-it-shouldnt
我有这个Haskell代码,当用GHC编译并运行时,中止检测到一个循环.
data Foo = Foo () deriving (Eq,Show) type Foop = Foo -> ((),Foo) noOp :: Foop noOp st = ((),st) someOp :: Foop someOp st@(Foo x) = ((),st) (<+>) :: Foop -> Foop -> Foop (<+>) f g st = let ((_,st'),(_,st'')) = ((f st),(g st')) in ((),st'') main = print $(noOp <+> someOp) $Foo ()
我认为不应该,这里有一些修改.他们中的每一个使循环消失:
>更改数据Foo到newtype Foo
> change(noOp〜someOp)到(someOp&no; noOp)
删除解构@(Foo x)
这是GHC中的错误还是我对评估过程缺乏了解?
模式匹配(_,_)要求(f st,g st’)的WHNF.简单.
模式匹配(_,(_,_))需要gst’的WHNF.这是问题,因为g是严格的,因此它首先需要在WHNF中.运行时在模式((_,st’),(_,_))中查找st’,所以在实际上可以遍历到st之前,需要两个元组的WHNF.因为g是严格的,这首先需要st …等等.
如果您将g的结果与懒惰的无可辩驳的模式相匹配
(<+>) f g st = let ((_,st'), ~(_,st'')) = (f st, g st') in ((),st'')
那么这个问题就消失了,因为这样被评估:
模式匹配(_,_)要求(f st,g st’)的WHNF.简单.
模式匹配(_,〜(_,_))暂时不再需要了.
模式匹配((_,st’),〜(_,_))要求fst的WHNF.幸运的是,我们可以实现这一点,因为st不依赖于模式.
>现在我们已经满足了模式匹配,运行时可以在((),st“)中进行.只有在这一点上,这是无可辩驳的模式〜(_,st“)被强制,但现在这不是一个问题,因为st’在这里可用,所以这只是计算一次的问题.
您尝试过的修复程序都使g非严格:
remove the deconstruction @(Foo _)
没有了,g并不需要看它的参数来构造结果框架,也就是说,元组匹配(_,st“)可以成功,而不必先要求st’的WHNF.
change data Foo
to newtype Foo
这具有Foo构造函数在运行时并不存在的效果,所以模式st @(Foo _)将不会强制执行.
change noOp <+> someOp
to someOp <+> noOp
正如我所说,循环只是因为g是严格的.如果你把f放在自己的位置,那是不严格的,那没有问题.
代码日志版权声明:
翻译自:http://stackoverflow.com/questions/37846161/haskell-program-aborts-with-loop-but-i-think-it-shouldnt
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 如何优雅地中止线程?
- Java多线程之线程中止
- python – django reg extend – 当前事务被中止,命令被忽略直到事务块结束
- 008.Python循环for循环
- 006.Python循环语句while循环
- 007.Python循环语句while循环嵌套
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python for Data Analysis
Wes McKinney / O'Reilly Media / 2012-11-1 / USD 39.99
Finding great data analysts is difficult. Despite the explosive growth of data in industries ranging from manufacturing and retail to high technology, finance, and healthcare, learning and accessing d......一起来看看 《Python for Data Analysis》 这本书的介绍吧!