创建一个具有无限列表的元素生成器

时间:2016-09-08 01:45:01

标签: haskell quickcheck

我正在玩QuickCheck,偶然发现了一些奇怪的行为

sample $ elements [1..5]

按预期工作,但是

sample $ elements [1..]

在ghci中挂起,即使使用Int

等有限类型也是如此
sample $ elements [(1::Int)..]

为什么它不打印任意(双关语:)大Int s?

更新

我使用

测试了@ amalloy的解释
sample $ elements ([1 .. ] :: [Int8])

终止。

2 个答案:

答案 0 :(得分:4)

elements随机统一选择元素,这意味着平均而言,它会将length / 2个项目放入列表中。对于无限值,这是不可能的,对于像[1..] :: [Int]这样的大型有限列表,这仍然达到了10亿个项目,一次一个地通过链表。相当缓慢的操作!

答案 1 :(得分:1)

#!/bin/bash FINDER="1" DOCK="2" CAFF="3" echo Select an option: echo 1. killall Finder echo 2. killall Dock echo 3. caffeinate echo Enter you choice: read CHOICE if [ "$CHOICE"="$FINDER" ]; then killall Finder elif [ "$CHOICE"="$DOCK" ]; then killall Dock elif [ "$CHOICE"="$CAFF" ]; then caffeinate fi exit 似乎记录不清。除了非空之外,参数应该是有限。请参阅源代码:

elements

它尝试计算输入列表的长度,这将导致无限列表上的无限循环。