2012-11-15 7 views
6

Kann mir jemand weniger als fünf Zeilen Code zur Verfügung stellen, die ich als .hs speichern und als Haskell-Programm ausführen kann? Das Internet ist manchmal so kompliziert.Benötigen Sie das einfachste Haskell-Programm

+4

'echo "main = return()" | runhaskell', da Sie nach dem "einfachsten" Programm gefragt haben. :-) – David

Antwort

6

Diese Antwort ist mehr auf "Sehen die Magie geschehen":

data Expression = Greeting | Leaving 

f :: Expression -> String 
f Greeting = "Hi there!" 
f Leaving = "Ok, bye!" 

main = putStrLn (f Greeting) 
3

drucken jede Zahl:

main = mapM_ print [1..] 
+0

Abhängig von der Zeilenpufferung kann dies jedoch niemals etwas anzeigen ... – amindfv

+0

'print' fügt automatisch neue Zeilen an, da es äquivalent zu' putStrLn ist. show ', so dass die Ausgabe unter allen Pufferschemen angezeigt wird. Ich habe auch jedes Pufferschema getestet, um sicherzugehen. –

5

Wie wäre es alle Fibonacci-Zahlen? Nun, Sie können nur so etwas wie 100 von ihnen für die Kürze drucken ..;)

fibs = 1 : scanl (+) 1 fibs 
main = print $ take 100 fibs 
3

Sie könnten fröhlich gehen. Hier greet ist eine Funktion, die einen Namen und macht einen Gruß aus dauert es:

greet xs = "\nHello, " ++ xs 

main = do 
    putStrLn $ unlines ["Hi! I'm a Haskell program.", "Who are you?"] 
    fmap greet getLine >>= putStrLn 

main verwendet unlines eine Liste von Strings in einer einzigen Newline getrennte Zeichenfolge zu drehen, dann druckt er mit putStrLn. getLine gibt eine vom Benutzer eingegebene Textzeile zurück (ohne das Newline-Zeichen) und wendet dann greet darauf an. Schließlich schieben wir das als Eingabe in einen anderen putStrLn.

2

Dieser ist ein bisschen dicht, und definitiv nicht der einfachste, aber es benutzt die unendliche Liste [1..], die man magisch nennen könnte.

described name list = putStrLn ("\n" ++ name) >> mapM_ print (zip [1..] list) 
main = let somenums = [1..100] in do 
    described "Some cubes:" [ x^3 | x <- somenums] 
    described "Some powers:" $ map (2^) somenums 
    described "Some triangle numbers:" $ scanl (+) 0 somenums 

Die described Funktion eine Beschreibung druckt und druckt dann eine Liste gepaart (gezippt) mit ihrer Position. Ich verwende es auf ein paar Zahlenfolgen. Ganzzahlige Daten sind standardmäßig auf Integer eingestellt, weshalb sie Ihnen gerne 2^100 mitteilen können. Der Int Datentyp ist begrenzter, (maxBound :: Int == 2147483647), benötigt aber natürlich weniger Zeit und Platz.

+0

Wow, das ist mächtig. Könnte ein bisschen zu viel für mein Gehirn sein, um gerade noch lol zu behandeln. Aber ich werde in naher Zukunft auf diesen Kommentar zurückkommen. Danke AndrewC! – Emanegux

10

Jemand sollte interact erwähnt haben, die einfach ist und tatsächlich praktisch:

main = interact reverse 
$ cat interact.hs | runhaskell interact.hs 
esrever tcaretni = niam 

und somit mit

main = interact (unwords . reverse . words) 
$ cat interact.hs | runhaskell interact.hs 
words) . reverse . (unwords interact = main 

oder mit einem Import

import Data.List 
main = interact (intersperse '\n') 
$ echo "hello" | runhaskell interact.hs 
h 
e 
l 
l 
o 

oder, jetzt kompilieren:

main = interact showCharcount 
    where showCharcount str = show (length str) ++ "\n" 
$ ghc --make -O2 interact.hs -o charcount 
$ echo "hello world" | ./charcount 
12 

In diesem Fall ist es sinnvoll tut ein bisschen armen Mannes Benchmarking zu starten macht:

$ time cat /usr/share/dict/words | ./charcount 
2486813 
real 0m0.096s 
+0

Sehr schön - vier kurze, klare Programme. – AndrewC

4

Hamming Zahlen sind Zahlen, die don keine Primfaktoren größer als 5. Dh Sie haben die Form 2^i * 3^j * 5^k. Die ersten 20 von ihnen sind:

[1,2,3,4,5,6,8,9,10,12,15,16,18,20,24,25,27,30,32,36] 

Die 500000. ist:

1962938367679548095642112423564462631020433036610484123229980468750 

Das Programm, das die 500000. eine (nach einem kurzen Moment der Berechnung) gedruckt ist:

merge [email protected](x:xs) [email protected](y:ys) = 
    case (x`compare`y) of 
    LT -> x:merge xs yys 
    EQ -> x:merge xs ys 
    GT -> y:merge xxs ys 

hamming = 1 : m 2 `merge` m 3 `merge` m 5 
    where 
    m k = map (k *) hamming 

main = print (hamming !! 499999) 

Das ist länger als die 5 Codezeilen, die Sie haben wollten. Natürlich könnte es golfed sein, aber ich würde es lieber natürlich schreiben und sehen, wie viele Zeilen Sie brauchen, um diese Zahl in einer anderen Sprache zu berechnen, mit angemessener Ausführungszeit.

1

Von Tutorials/Programming Haskell/String IO beachten Sie mehrere Start kurze und einfache Beispiele; beispielsweise auf dem äquivalenten cat < myFile.txt,

main = interact id 

einschlagen, wo interact eine Funktion (in diesem Fall die Identitätsfunktion id) auf die Inhalte von der Standardeingabe (hier myFile.txt) gilt.

Compile und führen Sie es wie folgt,

ghc --make short.hs 
./short < myFile.txt