首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >haskell中的元组严格吗?

haskell中的元组严格吗?
EN

Stack Overflow用户
提问于 2020-04-24 00:34:17
回答 1查看 181关注 0票数 3

如果我在repl.it上运行下面的代码时,有问题理解为什么它没有停止。

代码语言:javascript
运行
复制
-- The second argument is meant to be an infinite ascending list, don't bother yourself with any other case
isin :: Int -> [Int] -> (Bool, [Int])
isin n []       = (False, []) -- This case is unnecessary because the list is infinite, but just for completion
isin n l@(x:xs) =
  case n `compare` x of
    LT -> (False, l)
    EQ -> (True, xs)
    GT -> isin n xs

>>> isin 2 [1..]
-- prints nothing              --Edit
-- expected (True, [3,4,5...   --Edit

在我看来,它的执行应该是这样的:

代码语言:javascript
运行
复制
-- underscore is meant to be "unevaluated". (Probably not 100% accurate but you can follow my idea)

isin 2 1:_      -- first call 
  2 `compare` 1 -- GT
  isin 2 _

isin 2 2:_      -- second call
  2 `compare` 2 -- EQ
  (True, _)

(True, 3:_)     -- returned result

AFAIK,这应该可以正常工作,除非元组是严格的,在这种情况下,我将使用不同的结构...但我90%肯定他们不是

如果你想知道,这个想法是isin将被多次调用,在相同的列表上增加数字,这样我就可以在检查时降低头。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-24 03:12:27

你看到的是repl.it的神器。在你的计算机上的GHCi中,这将如你所期望的那样运行。特别是,在生成所有输出之前,repl.it似乎不会向您发送任何输出。这里有两个示例将演示这一点:

代码语言:javascript
运行
复制
import Control.Concurrent
mapM_ (\i -> threadDelay 1000000 *> print i) [1..10]

如果你在repl.it上运行它,10秒钟内什么都不会发生,然后你会突然得到所有的10个数字。如果你在电脑上的GHCi上运行它,那么你会在10秒内每秒得到一个数字。

代码语言:javascript
运行
复制
[0..]

如果你在repl.it上运行它,它永远不会返回任何东西。如果你在电脑上的GHCi上运行它,你会得到一个永无止境的所有自然数的流。

有趣的是,这似乎只发生在您从控制台/终端(右侧)运行的代码中。如果您将所有代码放在一个文件中(左侧)并使用run按钮,那么它的工作方式与本地运行相同。

我在https://repl.it/bugs/p/consoleterminal-doesnt-show-output-until-the-end上发布了这一点--我们看看他们会怎么说。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61392342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档