誰かが私に5行未満のコードを提供してくれますか?それを.hsとして保存し、haskellプログラムとして実行して、魔法が起こるのを見ることができますか?インターネットは時々とても複雑です。
10 に答える
main = putStrLn "Hello, World!"
http://www.haskell.org/haskellwiki/Haskell_in_5_stepsから
インターネットも悪くない!
interact
シンプルで実際に実用的なものを誰かが言及しているはずです。
main = interact reverse
$ 猫の対話.hs | runhaskellのinteract.hs esrever tcaretni = ニアム
したがって、
main = interact (unwords . reverse . words)
$ 猫の対話.hs | runhaskellのinteract.hs 言葉)。逆行する 。(無言のやり取り = メイン
またはインポートで
import Data.List
main = interact (intersperse '\n')
$ echo "こんにちは" | runhaskellのinteract.hs 時間 e l l o
または、今コンパイル中:
main = interact showCharcount
where showCharcount str = show (length str) ++ "\n"
$ ghc --make -O2 interact.hs -o charcount $ echo "こんにちは世界" | ./charcount 12
その場合、少し貧弱なベンチマークを開始することは理にかなっています。
$ 時間猫 /usr/share/dict/words | ./charcount 2486813 実質 0m0.096s
この回答は、「魔法が起こるのを見る」ことに重点を置いています。
data Expression = Greeting | Leaving
f :: Expression -> String
f Greeting = "Hi there!"
f Leaving = "Ok, bye!"
main = putStrLn (f Greeting)
すべてのフィボナッチ数はどうですか?さて、あなたは簡潔にするためにそれらの100のようなものを印刷することができます..;)
fibs = 1 : scanl (+) 1 fibs
main = print $ take 100 fibs
ハミング数は、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]
500000番目のものは次のとおりです。
1962938367679548095642112423564462631020433036610484123229980468750
500000 番目のものを出力したプログラム (短い計算の後) は次のとおりです。
merge xxs@(x:xs) yys@(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 行のコードよりも長くなっています。もちろん、ゴルフをすることもできますが、自然に書いて、妥当な実行時間で、他の言語でその数を計算するのに何行かかるかを確認したいと思います。
あなたは陽気に行くことができます。以下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
。
すべての数値を出力:
main = mapM_ print [1..]
これは少し密度が高く、間違いなく最も単純ではありません[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
が、もちろん時間とスペースが少なくて済みます。
チュートリアル/プログラミング Haskell/String IOから、複数の起動時の短くて簡単な例に注意してください。たとえば、 bashcat < myFile.txt
に相当します。
main = interact id
whereは、標準入力 (ここでは ) からの内容にinteract
関数 (この場合は恒等関数) を適用します。id
myFile.txt
次のようにコンパイルして実行します。
ghc --make short.hs
./short < myFile.txt