谁能给我提供少于五行的代码,我可以将它们保存为 .hs 并作为 haskell 程序运行并见证奇迹发生吗?互联网有时是如此复杂。
10 回答
应该有人提到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
这个答案更侧重于“看到奇迹发生”:
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 行代码要长。当然它可以打高尔夫球,但我宁愿自然地写它,看看你用任何其他语言计算这个数字需要多少行,并具有合理的执行时间。
打印每个数字:
main = mapM_ print [1..]
你可以高兴起来。这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
.
这个有点密集,绝对不是最简单的,但它确实使用了[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
),但当然需要更少的时间和空间。
来自Tutorials/Programming Haskell/String IO注意多个启动的简短示例;例如相当于 bash cat < myFile.txt
,
main = interact id
whereinteract
将函数(在本例中为标识函数id
)应用于来自标准输入(此处myFile.txt
)的内容。
编译运行如下,
ghc --make short.hs
./short < myFile.txt