6

谁能给我提供少于五行的代码,我可以将它们保存为 .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 
$ cat interact.hs | runhaskell interact.hs
esrever tcaretni = 尼亚姆

因此与

main = interact (unwords . reverse . words)
$ cat interact.hs | runhaskell interact.hs
字) 。逆转 。(unwords 交互 = 主要

或进口

import Data.List
 main = interact (intersperse '\n')
$ 回声“你好” | runhaskell interact.hs
H
e
l
l
○

或者,现在编译:

main = interact showCharcount 
  where showCharcount str = show (length str) ++ "\n"
$ ghc --make -O2 interact.hs -o 字符数
$ echo "你好世界" | ./字符数
12

在这种情况下,开始做一些穷人的基准测试是有意义的:

$ 时间猫 /usr/share/dict/words | ./字符数
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

Haskell 的快速入门

于 2012-11-15T05:56:09.000 回答
3

打印每个数字:

main = mapM_ print [1..]
于 2012-11-15T16:24:05.227 回答
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 回答
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

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

main = interact id

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

编译运行如下,

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