0

我具備的功能pyths函數調用超出範圍在WHERE子句

-- takes an Int and returns a list of pythagorean triples whose components 
---- are at most the given Int 
pyths :: Int a => a -> [(Int, Int, Int)] 
pyths n = [(x, y, z) | x <- f, y <- f, z <- f, x^2 + y^2 == z^2] 
    where f = factors n 

我得到的錯誤factors超出範圍。 如何編寫此功能,因此的範圍是

我已經試過:

pyths n = [(x, y, z) | x <- f, y <- f, z <- f, x^2 + y^2 == z^2 where f = factors n] 

和:

pyths n = [(x, y, z) | x <- f, y <- f, z <- f, x^2 + y^2 == z^2, where f = factors n] 

但我只是得到語法錯誤。


注: 我知道這可能不是真正做什麼,我打算做的事。

+9

您可以通過在某處實際定義「因素」來使「因素」處於範圍之內。 – sepp2k

+1

這不是前奏曲,也不是標準庫中的其他地方。 – sepp2k

+4

注意:'Int'不是一個類型類,所以你不能在類型約束中使用它。也許你的意思是'Integral',它是整型類型的類型,或者是'Int - > [(Int,Int,Int)]'中的普通類型'Int''? – hammar

回答

4

正如sepp2k所說,你需要定義factors。在你的例子你改變其中f定義,它使用的因素在它的定義,但沒有你在哪裏說:

factors x = ... 

由於在Haskell的前奏或其他基礎庫中沒有定義factors功能,你必須寫這個你自己。我期望,primes包將對您有用。

+3

只是爲了滋擾(以及一些無恥的自我廣告),使用更少內存的素數更快生成可以從[NumberSieves](http://hackage.haskell.org/package/NumberSieves)和[arithmoi ](http://hackage.haskell.org/package/arithmoi)。這兩個軟件包還提供了更快的因式分解,對篩選範圍內數字的NumberSieves(通常不超過10^9),arithmoi(慢,但使用更少的內存)和使用蒙哥馬利曲線的常規因式分解,可處理數字高達50-60位在合理的時間。 –