需要最简单的Haskell程序

时间:2012-11-15 05:43:01

标签: haskell

任何人都可以向我提供少于五行的代码,我可以保存为.hs并作为haskell程序运行并看到魔法发生了吗?互联网有时很复杂。

10 个答案:

答案 0 :(得分:12)

main = putStrLn "Hello, World!"

来自http://www.haskell.org/haskellwiki/Haskell_in_5_steps

互联网并不是那么糟糕!

答案 1 :(得分: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

答案 2 :(得分:6)

这个答案更侧重于“看到魔法发生”:

data Expression = Greeting | Leaving

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

main = putStrLn (f Greeting)

答案 3 :(得分:5)

所有斐波那契数字怎么样?好吧,为简洁起见,你可以打印100个这样的东西..;)

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

答案 4 :(得分: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行代码要长。当然它可以打高尔夫球,但我宁愿自然地写它,看看用任何其他语言计算这个数字需要多少行,并且执行时间合理。

答案 5 :(得分:3)

答案 6 :(得分:3)

打印每个号码:

main = mapM_ print [1..]

答案 7 :(得分: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

答案 8 :(得分: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),但当然需要更少的时间和空间。

答案 9 :(得分:1)

Tutorials/Programming Haskell/String IO注意多个启动简短的例子;例如,相当于bash cat < myFile.txt

main = interact id

其中interact将函数(在本例中为标识函数id)应用于标准输入(此处为myFile.txt)的内容。

编译并运行如下,

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