gpt4 book ai didi

haskell - 在 Frege 中表达渴望但在 Haskell 中很懒惰?

转载 作者:行者123 更新时间:2023-12-03 14:56:55 25 4
gpt4 key购买 nike

在 Haskell 中,以下代码打印“[1,2,3,4,5”:

foo = take 10 $ show $ numbersFrom 1 where 
numbersFrom start = start : numbersFrom (start + 1) -- could use [1..]

但在弗雷格,它抛出 OutOfMemoryError使用以下代码:
foo = take 10 $ unpacked $ show $ numbersFrom 1 where
numbersFrom start = start : numbersFrom (start + 1)

这里唯一的区别是 unpackedString 转换所需的函数至 [Char]和 FWIW, unpacked功能是急切的。为什么整个表达式不能像 Haskell 中那样懒惰?是否有可能在 Frege 中实现类似于 Haskell 的东西?

最佳答案

我不认识弗雷格,但根据语言定义Stringjava.lang.String所以你不能构建无限长的字符串(内存不足问题可能与 unpack 急切无关)。

因为你知道 numbersFrom 1 的每个元素将显示为至少 1 个字符,然后您可以过度估计要显示的列表大小,然后解包,然后获取所需字符的数量:

foo = take 10 $ unpacked $ show $ take 10 $ numbersFrom 1 where
numbersFrom start = start : numbersFrom (start + 1)

或更一般地说:
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

如果您的枚举很昂贵,那么您可以开始考虑逗号、空格等的数量,并将参数减少到第二个 take ,但你明白了。

关于haskell - 在 Frege 中表达渴望但在 Haskell 中很懒惰?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11962844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com