<p>如果你有GHC可用,笛卡尔产品是一个同步!在</p>
<p><strong>Q1:一个文件</strong></p>
<pre><code>-- words.hs
import Control.Applicative
main = interact f
where f = unlines . g . words
g x = map (++) x <*> x
</code></pre>
<p>{1>然后将每个单词的列表附加到每个单词的列表中。在</p>
<p>用GHC编译</p>
^{pr2}$
<p>然后使用IO重定向运行:</p>
<pre><code>./words <words.txt >out
</code></pre>
<p><strong>Q2:两个文件</strong></p>
<pre><code>-- words2.hs
import Control.Applicative
import Control.Monad
import System.Environment
main = do
ws <- mapM ((liftM words) . readFile) =<< getArgs
putStrLn $ unlines $ g ws
where g (x:y:_) = map (++) x <*> y
</code></pre>
<p>像以前一样编译并以两个文件作为参数运行:</p>
<pre><code>./words2 words1.txt words2.txt > out
</code></pre>
<p><strong>Bleh,编译?</strong></p>
<p>想要shell脚本的便利性和编译后的可执行文件的性能吗?为什么不同时做呢?在</p>
<p>只需将所需的Haskell程序包装在包装器脚本中,该脚本在<code>/var/tmp</code>中编译该程序,然后将其自身替换为生成的可执行文件:</p>
<pre><code>#!/bin/bash
# wrapper.sh
cd /var/tmp
cat > c.hs <<CODE
# replace this comment with haskell code
CODE
ghc c.hs >/dev/null
cd - >/dev/null
exec /var/tmp/c "$@"
</code></pre>
<p>它处理参数和IO重定向,就像包装器不存在一样。在</p>
<p><strong>结果</strong></p>
<p>用两个2000字的文件对照其他答案计时:</p>
<pre><code>$ time ./words2 words1.txt words2.txt >out
3.75s user 0.20s system 98% cpu 4.026 total
$ time ./wrapper.sh words1.txt words2.txt > words2
4.12s user 0.26s system 97% cpu 4.485 total
$ time ./thanatos.py > out
4.93s user 0.11s system 98% cpu 5.124 total
$ time ./styko.sh
7.91s user 0.96s system 74% cpu 11.883 total
$ time ./user3552978.sh
57.16s user 29.17s system 93% cpu 1:31.97 total
</code></pre>