【发布时间】:2016-02-05 12:52:41
【问题描述】:
下面的函数应该生成素数,但它不适用于 GHC 7.10.2。其他人看到了吗?
GHCi, version 7.10.2: http://www.haskell.org/ghc/ :? for help
Prelude> import Data.List
Prelude Data.List> print . take 100 . nubBy (\x y -> x `rem` y == 0) $ [2..]
[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101]
奇怪的是,它似乎在这个网站上运行良好:
【问题讨论】:
-
我认为
nubBy需要等价关系。 -
这就是文档所说的,而这里传递的函数不是,这将导致未定义的行为。在实践中,它可以例如已被重写,使得参数以相反的顺序应用(对于等价函数是安全的,而不是像这样的任意函数)
-
它在这里工作得很好:rextester.com/LWZCQ71376
-
它适用于 ghc 7.6.3。也许
nubBy被修改和“优化”以依赖等价关系属性?
标签: haskell