मान लीजिए कि लंबाई एन के साथ सूची एल, लंबाई एन + 1 के साथ सूची जे में इंटरलीव किया गया है। हम जानना चाहते हैं, जे के प्रत्येक तत्व के लिए, एल के पड़ोसियों में से कौन सा बड़ा है। निम्नलिखित समारोह भी लंबाई के अपने इनपुट के रूप में एल लेता है, और एक सूची कश्मीर पैदा करता है, n + 1, इस तरह के मैं कश्मीर वें तत्व जे के मैं वें तत्व के वांछित पड़ोसी है किआउटपुट बनाम इनपुट सूची की लंबाई की जांच करने के लिए टाइप सिस्टम का उपयोग
aux [] prev acc = prev:acc
aux (hd:tl) prev acc = aux tl hd ((max hd prev):acc)
expand row = reverse (aux row 0 [])
मैं, अपने आप को साबित कर सकते हैं अनौपचारिक रूप से, यह है कि इस समारोह (जो मैं मूल रूप OCaml में लिखा था) का परिणाम की लंबाई इनपुट की लंबाई एक से अधिक है। लेकिन मैं हास्केल (मेरे लिए एक नई भाषा) तक पहुंच गया क्योंकि मुझे होने में दिलचस्पी है जो इस आविष्कार के प्रकार सिस्टम के माध्यम से साबित करने में सक्षम है।
* Could not deduce: (m1 :+: S (S m)) ~ S (m1 :+: S m)
from the context: n ~ S m1
bound by a pattern with constructor:
Cons :: forall a m. a -> List a m -> List a (S m),
in an equation for `aux'
at pyramid.hs:23:6-15
Expected type: List a (n :+: S m)
Actual type: List a (m1 :+: S (S m))
* In the expression: aux tl hd (Cons (max hd prev) acc)
In an equation for `aux':
aux (Cons hd tl) prev acc = aux tl hd (Cons (max hd prev) acc)
* Relevant bindings include
acc :: List a m (bound at pyramid.hs:23:23)
tl :: List a m1 (bound at pyramid.hs:23:14)
aux :: List a n -> a -> List a m -> List a (n :+: S m)
(bound at pyramid.hs:22:1)
ऐसा लगता है कि मैं क्या करने की जरूरत है:
{-# LANGUAGE GADTs, TypeOperators, TypeFamilies #-}
data Z
data S n
type family (:+:) a b :: *
type instance (:+:) Z n = n
type instance (:+:) (S m) n = S (m :+: n)
-- A List of length 'n' holding values of type 'a'
data List a n where
Nil :: List a Z
Cons :: a -> List a m -> List a (S m)
aux :: List a n -> a -> List a m -> List a (n :+: (S m))
aux Nil prev acc = Cons prev acc
aux (Cons hd tl) prev acc = aux tl hd (Cons (max hd prev) acc)
हालांकि, अंतिम पंक्ति निम्न त्रुटि पैदा करता है: this previous answer की मदद के साथ, मैं निम्नलिखित के रूप में जहाँ तक प्राप्त करने में सक्षम था क्या संकलक सिखाता है कि (x :+: (S y)) ~ S (x :+: y)
। क्या यह संभव है?
वैकल्पिक रूप से, इस प्रणाली के प्रकार के प्रकार के मुकाबले बेहतर उपकरण हैं?
ऐसा लगता है लेकिन ऐसा लगता है कि 'x' पर प्रेरण करके, और संभवतः 'x'' के लिए सिंगलटन को परिभाषित करना और उपयोग करना आवश्यक है। इसके अलावा, दुर्भाग्य से यह मशीनरी रनटाइम पर मिटा नहीं जाएगी, इसलिए हम केवल एक ही 'रेफ्ल' बनाने के लिए ओ (एन) चरणों को बर्बाद कर देंगे। (मैं वास्तव में चाहता हूं कि जीएचसी इसे ओ (1) किसी दिन अनुकूलित करे ... :)) – chi
@chi आपने इस तरह के जीएचसी अनुकूलन का कई बार उल्लेख किया है (जिसे मैं याद कर सकता हूं) और मैं वास्तव में यह चाहता हूं कि यह अस्तित्व में है भी। क्या इसके बारे में कोई मौजूदा प्रयास है जिसके बारे में आप जानते हैं? – Alec
@Alec मुझे अपने लंबे समय तक रेंट/इच्छा के लिए खेद है, मैं इसकी मदद नहीं कर सकता :) मैं जीएचसी विकास का पालन नहीं कर रहा हूं, इसलिए मैं इस पर टिप्पणी नहीं कर सकता कि इसके लिए कुछ योजनाएं हैं या नहीं। – chi