2016-04-03 6 views
3

Dies ist wahrscheinlich sehr einfach, aber ich kann nicht herausfinden, wie das Äquivalent von PythonListe von n Nullen in Haskell

[0]*n 

in Haskell zu tun, um eine Liste mit n Nullen zu erhalten.

[0]*n 

funktioniert nicht. Bin ich verpflichtet, etwas zu tun wie: [0 | x <-[1..5]]?

+0

Überprüfen Sie die Haskell-Tag Informationsseite erneut aus. Finden von Funktionen und anderen interessanten Dingen: http://stackoverflow.com/tags/haskell/info – jberryman

Antwort

8

Sie können dies tun:

λ> take 5 (repeat 0) 
[0,0,0,0,0] 

Oder wie @obadz weist darauf hin, das ist noch prägnanter:

λ> replicate 5 0 
[0,0,0,0,0] 

Ich persönlich mag es nicht, die Python-Syntax. * bedeutet Multiplikation, aber es tut etwas anderes in Ihrem Fall. Aber das ist nur meine Meinung :).

+11

Oder 'replizieren 5 0' – obadz

+2

' * 'funktioniert das gleiche für Listen und Ganzzahlen; es ist wiederholte Zugabe. 'some_list * 3 == 3 * some_list == some_list + some_list + some_list', wobei die Listenaddition nur Verkettung ist. – chepner

+1

@chepner Haskell funktioniert nicht so. –

-1

Sie können es selbst definieren (als Spielzeug Beispiel)

(*) :: [a] -> Int -> [a]      
(*) xs n = take n $ cycle xs 

so können Sie

Prelude> [0]*5              
[0,0,0,0,0] 

Prelude> [0,1]*5 
[0,1,0,1,0] 

offensichtlich haben, durch eine Neudefinition bestehenden Betreiber "Nebenwirkungen" haben

Prelude> 4*4 

<interactive>:169:1: 
    Non type-variable argument in the constraint: Num [a] 
    (Use FlexibleContexts to permit this) 
    When checking that `it' has the inferred type 
     it :: forall a. Num [a] => [a] 

oder vielleicht python Interpretation ist replizieren die Liste n mal (anstelle der Auswahl n Elemente aus den zyklischen Listenelementen). In diesem Fall können Sie es als

(*) :: [a] -> Int -> [a]                     
(*) xs n = concat $ replicate n xs                  


Prelude> [0]*4                           
[0,0,0,0] 

Prelude> [0,1]*4                          
[0,1,0,1,0,1,0,1] 

offensichtlich definieren kann, ist dies ein Spielzeug Beispiel und Sie können einen anderen Betreiber oder einfach nur eine Funktion für diese definieren möchten.

0

Eine andere Möglichkeit:

import Data.Monoid 

zeroes = 5 * [0] where (*) = mtimes