6

誰かが私に5行未満のコードを提供してくれますか?それを.hsとして保存し、haskellプログラムとして実行して、魔法が起こるのを見ることができますか?インターネットは時々とても複雑です。

4

10 に答える 10

12
main = putStrLn "Hello, World!"

http://www.haskell.org/haskellwiki/Haskell_in_5_stepsから

インターネットも悪くない!

于 2012-11-15T05:49:28.093 に答える
11

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
于 2012-11-16T19:45:41.770 に答える
7

この回答は、「魔法が起こるのを見る」ことに重点を置いています。

data Expression = Greeting | Leaving

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

main = putStrLn (f Greeting)
于 2012-11-15T14:56:38.153 に答える
5

すべてのフィボナッチ数はどうですか?さて、あなたは簡潔にするためにそれらの100のようなものを印刷することができます..;)

fibs = 1 : scanl (+) 1 fibs
main = print $ take 100 fibs
于 2012-11-15T21:14:51.993 に答える
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]

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 行のコードよりも長くなっています。もちろん、ゴルフをすることもできますが、自然に書いて、妥当な実行時間で、他の言語でその数を計算するのに何行かかるかを確認したいと思います。

于 2012-11-18T01:28:07.200 に答える
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

于 2012-11-16T03:56:32.600 に答える
3

Haskell のクイック スタート

于 2012-11-15T05:56:09.000 に答える
3

すべての数値を出力:

main = mapM_ print [1..]
于 2012-11-15T16:24:05.227 に答える
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^100Intデータ型はより制限されます ( )maxBound :: Int == 2147483647が、もちろん時間とスペースが少なくて済みます。

于 2012-11-16T04:20:42.277 に答える
1

チュートリアル/プログラミング Haskell/String IOから、複数の起動時の短くて簡単な例に注意してください。たとえば、 bashcat < myFile.txtに相当します。

main = interact id

whereは、標準入力 (ここでは ) からの内容にinteract関数 (この場合は恒等関数) を適用します。idmyFile.txt

次のようにコンパイルして実行します。

ghc --make short.hs
./short < myFile.txt
于 2015-04-22T05:47:42.663 に答える