2016-09-08 1 views
0

ich mit Quick ich spiele, und stolperte über einige seltsamen VerhaltenErstellen einen Elemente-Generator mit einer unendlichen Liste

sample $ elements [1..5] 

funktioniert wie erwartet, aber

sample $ elements [1..] 

hängt in GHCI, auch bei Verwendung von ein endlicher Typ wie Int

sample $ elements [(1::Int)..] 

Warum es nicht willkürlich drucken (S. un beabsichtigt :) groß Int s?

aktualisieren

I @ amalloy der explanantion getestet haben von

sample $ elements ([1 .. ] :: [Int8]) 

verwendet, die beendet ist.

Antwort

4

elements wählt Elemente gleichmäßig nach dem Zufallsprinzip aus, was bedeutet, dass im Durchschnitt length/2 Elemente in die Liste aufgenommen werden. Für unendliche Werte ist dies unmöglich, und für große endliche Listen wie [1..] :: [Int] erreicht diese immer noch 1 Milliarde Elemente in einer verknüpften Liste. Ziemlich langsame Operation!

+0

Danke, warum ist es im Durchschnitt "erreichen Länge/2 Elemente"? – dimid

+0

Ich meine, darüber nachdenken. In einer Liste mit 'N'-Elementen, was ist der durchschnittliche Index? Die Mitte ist der Durchschnitt, und es ist bei Index 'N/2'. Da Sie sich gleichmäßig nach dem Zufallsprinzip entscheiden, ist Ihr durchschnittlicher Index der durchschnittliche Index der Liste. – amalloy

+0

Richtig, aber warum sollten Sie die ersten '[len/2] - 1' Elemente durchqueren? Wenn Sie das Maximum 'Int' kennen, können Sie es in O (1) erhalten, indem Sie in 2 teilen. Entschuldigung, wenn ich etwas Offensichtliches vermisse, bin ich ein Anfänger mit Haskell. – dimid

1

Es scheint, dass elements schlecht dokumentiert ist. Das Argument sollte nicht leer sein, sondern finite sein. Siehe den Quellcode:

-- | Generates one of the given values. The input list must be non-empty. 
elements :: [a] -> Gen a 
elements [] = error "QuickCheck.elements used with empty list" 
elements xs = (xs !!) `fmap` choose (0, length xs - 1) 

Es wird versucht, die Länge der Eingabeliste zu berechnen, die eine Endlos-Schleife auf einer unendlichen Liste verursachen.

+0

Tatsächlich, wie amalloy gezeigt hat, ist die fragliche Liste aufgrund des Typs "[Int]" endlich. Abhängig von Ihrer Maschine kann "Int" 32 oder 64 Bit sein. Im ersten Fall kann ein Computer mit einer großen Menge an RAM (eventuell) enden. In letzterem Fall wird Ihnen definitiv der Speicher ausgehen. – crockeea

Verwandte Themen