जॉन ह्यूजेस, अपने प्रसिद्ध Why Functional Programming Matters हकदार लेख में, डेटा प्रकार सूचियों और आदेश दिया लेबल पेड़ के लिए, का वर्णन करता हैजॉन ह्यूजेस के 'फ़ोल्ड्री' के बारे में क्या मैं गलतफहमी कर रहा हूं?
listof * ::= Nil | Cons * (listof *) treeof * ::= Node * (listof (treeof *))
और एक समारोह foldtree
कहा जाता है,
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
मैंने उन दो डेटा टाइप को लागू किया है हास्केल में तों और मैं वर्तमान में 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
कोशिश कर रहा हूँ, लेकिन मैं प्रकार बेमेल हो रही है: (
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)’
(आदि)
ह्यूजेस बारे में कुछ और सोच के बाद छद्म) foldtree
का कार्यान्वयन, मुझे यकीन नहीं है कि मैं इसे समझता हूं, और उन प्रकार के विसंगतियां अब मेरे लिए स्पष्ट प्रतीत होती हैं। विशेष रूप से, foldtree
के चौथे तर्क के प्रकार के तीन पैटर्न पर एक जैसी प्रतीत नहीं होता:
-
पहले पैटर्न में
- , कि तर्क टाइप
Treeof a
है, जबकि - पिछले दो पैटर्न में, यह है
Listof (Treeof a)
टाइप करें।
मुझे क्या याद आ रही है?
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
मुझे लगता है कि लेखक को गलती से संयुक्त है:
मैं मिरांडा या तो पता नहीं है, लेकिन अगर यह ऐसी बात की अनुमति दी मैं आश्चर्य होगा। मुझे संदेह है कि अनौपचारिक प्रस्तुति परिकल्पना गलत संयोजन की तुलना में सच्चाई के करीब है, लेकिन आपको जॉन ह्यूजेस से पूछना होगा (और यदि आपके पास उनसे प्रश्न पूछने का मौका है, तो आप उससे कुछ और दिलचस्प पूछने से बेहतर हो सकते हैं)। – dfeuer
यह किसी भी विशेष कार्यात्मक भाषा में नहीं लिखा गया है, और कागज से सटीक कोड एक कंपाइलर के माध्यम से नहीं किया गया है। मैंने जॉन को हास्केल कोड के साथ अपने पेपर को अपडेट करने के लिए राजी करने की कोशिश की है, लेकिन वह बहुत व्यस्त है। लेकिन अगर किसी और ने ऐसा किया, तो मुझे यकीन है कि वह योगदान स्वीकार करेगा। – augustss
@augustss उस के लिए धन्यवाद :) – Jubobs