2012-11-15 33 views
6

任何人都可以提供少於5行的代碼,我可以保存爲.hs並作爲haskell程序運行,並看到魔法發生?互聯網有時候非常複雜。需要最簡單的Haskell程序

+4

'回聲 「主=回報()」 | runhaskell',因爲你問過「最簡單」的程序。 :-) – David

回答

6

這個答案的更側重於 「看魔術發生」:

data Expression = Greeting | Leaving 

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

main = putStrLn (f Greeting) 
3

打印每一個數字:

main = mapM_ print [1..] 
+0

但是,根據行緩衝,這可能永遠不會顯示任何東西... – amindfv

+0

'print'自動附加新行,因爲它等同於'putStrLn。 show',所以它將在所有緩衝方案下顯示輸出。我也只是測試每個緩衝方案,以確保。 –

5

如何所有的斐波那契數?那麼,爲了簡潔起見,你可以打印一些像其中的100個;;)

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

你可以去歡樂。這裏greet是一個函數,它的名稱,使問候出來的:

greet xs = "\nHello, " ++ xs 

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

main使用unlines把字符串列表到一個單一的換行符分隔的字符串,然後用putStrLn打印它。 getLine返回用戶輸入的文本行(不帶換行符),然後將greet應用於該行。最後我們把它作爲輸入到另一個putStrLn

2

這是一個有點密集,絕對不是最簡單的,但它確實使用無限列表[1..],你可以稱之爲魔術。

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 

described函數打印的說明,然後打印與他們的位置成對的列表(壓縮)。 我在幾個數字序列上使用它。整數數據默認爲Integer,這就是爲什麼它可以愉快地告訴你2^100。數據類型Int更受限制,(maxBound :: Int == 2147483647),但當然需要更少的時間和空間。

+0

哇,這是強大的。可能對我的大腦來說有點太過於處理,只是還沒有大聲笑。但我會在不久的將來回到這個評論。謝謝AndrewC! – Emanegux

10

應該有人提到interact既簡單又實用的實際:

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

從而與

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

或進口

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

,或者現在編譯:

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

在這種情況下,這是有道理的,開始做了一些窮人的標杆:

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

非常好 - 四個簡短,清晰的程序。 – AndrewC

4

海明數字號碼,唐沒有任何主要因素大於5.也就是說,他們有形式2^i * 3^j * 5^k。它們的前20個是:

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

的第五十○萬之一是:

1962938367679548095642112423564462631020433036610484123229980468750 

印刷在第五十○萬酮(計算的短暫的時間後)的程序是:

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) 

這比你想要的5行代碼長。當然,它可能是高爾夫球,但我寧願自然寫它,看看你需要多少線來計算在任何其他語言的數量,具有合理的執行時間。

1

Tutorials/Programming Haskell/String IO注意多個啓動簡短的例子;例如相當於打壞cat < myFile.txt

main = interact id 

其中interact從標準輸入(這裏myFile.txt)應用一個函數(在這種情況下,身份功能id)上的內容。

編譯並如下運行它,

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