John Hughes, Why Functional Programming Matters başlıklı meşhur makalesinde, listeler ve sipariş etiketli ağaçlar içinJohn Hughes '`foldtree' 'Ne yanlış anlama var?
listof * ::= Nil | Cons * (listof *)
treeof * ::= Node * (listof (treeof *))
ve
foldtree
adlı bir işlev, veri türleri açıklanmıştır
foldtree f g a (Node label subtrees) = f label (foldtree f g a subtrees) foldtree f g a (Cons subtree rest) = g (foldtree f g a subtree) (foldtree f g a rest) foldtree f g a Nil = a
Bu iki veri tipini uygulamalıyım Haskell es ve şu anda, foldtree
data Listof a = Nil | Cons a (Listof a)
deriving (Read, Show, Eq)
-- implementation of some list functions... (skipped)
data Treeof a = Node a (Listof (Treeof a))
deriving (Read, Show, Eq)
foldtree f g a (Node label subtrees) = f label (foldtree f g a subtrees)
foldtree f g a (Cons subtree rest) = g (foldtree f g a subtree) (foldtree f g a rest)
foldtree f g a Nil = a
uygulamak çalışıyorum ama tip uyuşmazlıklar alıyorum: (Hughes hakkında biraz daha düşündükten sonra
Couldn't match expected type ‘Treeof t’
with actual type ‘Listof (Treeof t)’
Relevant bindings include
subtrees :: Listof (Treeof t) (bound at whyFunMatters.hs:27:28)
label :: t (bound at whyFunMatters.hs:27:22)
f :: t -> t1 -> t1 (bound at whyFunMatters.hs:27:10)
foldtree :: (t -> t1 -> t1)
-> (t1 -> t1 -> t1) -> t1 -> Treeof t -> t1
(bound at whyFunMatters.hs:27:1)
In the fourth argument of ‘foldtree’, namely ‘subtrees’
In the second argument of ‘f’, namely ‘(foldtree f g a subtrees)’
(vs)
pseudo) foldtree
'un uygulanması, bunu anladığımdan pek emin değilim ve bu tür uyumsuzluklar benim için açık görünüyor. Son iki desenlerde
Treeof a
tip vardır, ilk desende
- : Daha spesifik olarak,
foldtree
'ın dördüncü bağımsız değişken türü üç kalıplarının arasında tutarlı görünmüyorListof (Treeof a)
yazın.
Neyi eksik?
foldtree :: (a -> c -> b) -> (b -> c -> c) -> c -> Treeof a -> b
foldtree f g a (Node label subtrees) = f label (foldforest f g a subtrees)
foldforest :: (a -> c -> b) -> (b -> c -> c) -> c -> Listof (Treeof a) -> c
foldforest f g a (Cons subtree rest) = g (foldtree f g a subtree) (foldforest f g a rest)
foldforest f g a Nil = a
Yazar, yanlışlıkla bir araya düşünüyorum:
ama böyle bir şey izin eğer çok şaşırırım: modülerlik ve çokdilli maksimize
foldtree
tam tanımı, bunun olmalıdır. Gayri resmi sunum hipotezinin yanlış birleşimden ziyade gerçeğe daha yakın olduğunu sanıyorum, ama John Hughes'a sormalısınız (eğer ona soru sorma şansınız varsa, ona daha ilginç bir şey sormaktan daha iyi olabilirsiniz). – dfeuerO herhangi bir fonksiyonel dilde yazılmış değil ve kağıttan kesin kod derleyici sayesinde olmamıştır. John'u Haskell koduyla güncellemesi için ikna etmeye çalıştım ama çok meşgul. Ama bir başkası yaptıysa, o katkıyı kabul edeceğine eminim. – augustss
@augustss Bunun için teşekkürler :) – Jubobs