Haskell程序中止与“循环”,但我认为它不应该

栏目: 编程语言 · 发布时间: 7年前

内容简介:代码日志版权声明:翻译自: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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python for Data Analysis

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》 这本书的介绍吧!

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具