模板Haskell:zipn

时间:2011-04-22 16:28:27

标签: haskell template-haskell

我正在阅读archive.org中的Template Haskell tutorial,因为它已经从haskell.org丢失了,并注意到它已损坏,就像随机部分被取出一样。

我希望了解他们对zipn的实现。他们唯一的代码是:

\ y1 y2 y3 ­>
  case (y1,y2,y3) of
    (x1:xs1,x2:xs2,x3:xs3) ­> (x1,x2,x3) : ff xs1 xs2 xs3
    (_,_,_) ­> []

mkZip :: Int ­> Expr ­> Expr
mkZip n name = lam pYs (caseE (tup eYs) [m1,m2])
  where
    (pXs, eXs) = genPE "x" n
    (pYs, eYs) = genPE "y" n
    (pXSs,eXSs) = genPE "xs" n
    pcons x xs = [p| $x : $xs |]
    b = [| $(tup eXs) : $(apps(name : eXSs)) |] 
    m1 = simpleM (ptup (zipWith pcons pXs pXSs)) b
    m2 = simpleM (ptup (copies n pwild)) (con "[]")

这对我没有意义。有没有人有一个很好的教程副本?或者是archive.org上的内容是什么?

2 个答案:

答案 0 :(得分:1)

快速搜索本文由Simon Peyton-Jones自己撰写的题为“Template Meta-programming for Haskell”的文章!
希望这有帮助!

答案 1 :(得分:0)

请注意,据我所知,本文中发现的zipN的实现从未实际编译过GHC的已发布版本。我试图自己编译,我收到了这封电子邮件中描述的错误:

http://www.haskell.org/pipermail/template-haskell/2003-July/000126.html(未实现模式切片)。

这在2003年没有实现,但今天仍未实现:http://www.haskell.org/ghc/docs/7.6.1/html/users_guide/template-haskell.html(不支持模式切片)

但是你可以使用模板haskell找到zipWithN的实现:

http://www.haskell.org/haskellwiki/Template_Haskell#zipWithN