在Haskell中,以下代码打印"[1,2,3,4,5":
foo = take 10 $ show $ numbersFrom 1 where
numbersFrom start = start : numbersFrom (start + 1) -- could use [1..]
Run Code Online (Sandbox Code Playgroud)
但在弗雷格,它抛出OutOfMemoryError以下代码:
foo = take 10 $ unpacked $ show $ numbersFrom 1 where
numbersFrom start = start : numbersFrom (start + 1)
Run Code Online (Sandbox Code Playgroud)
这里唯一的区别是unpacked转换String为[Char]和FWIW所需的unpacked功能,功能是急切的.为什么整个表达式不能像Haskell一样懒惰?是否有可能在弗雷格实现与Haskell相似的东西?
我不知道弗雷格,但根据语言的定义String是java.lang.String这样,你不能建立无限长的字符串(内存不足问题可能有无关,与unpack被渴望).
因为您知道每个元素numbersFrom 1将显示为至少1个字符,那么您可以过度估计列表的大小以显示然后解压缩,然后获取所需字符的数量:
foo = take 10 $ unpacked $ show $ take 10 $ numbersFrom 1 where
numbersFrom start = start : numbersFrom (start + 1)
Run Code Online (Sandbox Code Playgroud)
或者更一般地说:
n = 10 -- number of characters to show
m = 1 -- minimum (map (length . show) xs) for some type of xs
foo :: a -> [Char]
foo = take n . unpack . show . take ((n+m-1) `div` m) . someEnumeration
where
someEnumeration :: a -> [a]
someEnumeration = undefined
Run Code Online (Sandbox Code Playgroud)
如果你的枚举很昂贵,那么你可以开始考虑逗号,空格等的数量,并将参数减少到第二个take,但你明白了.
我没有使用弗雷格,但在我看来,如果unpacked是严格的,那么它的论点不应该是无限的列表.尝试unpacked $ take 10而不是take 10 $ unpacked.
| 归档时间: |
|
| 查看次数: |
443 次 |
| 最近记录: |