任何人都可以向我提供少于五行的代码,我可以保存为.hs并作为haskell程序运行并看到魔法发生了吗?互联网有时很复杂。
答案 0 :(得分:12)
答案 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)
[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^100
。 Int
数据类型更受限制,(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