मैं हास्केल में ट्रांसड्यूसर कार्यान्वित इस प्रकार है:ट्रांसड्यूसर्स और monomorphism प्रतिबंध
{-# LANGUAGE RankNTypes #-}
import Prelude hiding (foldr)
import Data.Foldable
type Reducer b a = a -> b -> b
type Transducer a b = forall t. Reducer t b -> Reducer t a
class Foldable c => Collection c where
insert :: a -> c a -> c a
empty :: c a
reduce :: Collection c => Transducer a b -> c a -> c b
reduce f = foldr (f insert) empty
mapping :: (a -> b) -> Transducer a b
mapping f g x = g (f x)
अब मैं एक सामान्य map
समारोह को परिभाषित करना चाहते। इसलिए मैं GHCi में उपरोक्त कोड को लोड:
Prelude> :load Transducer
[1 of 1] Compiling Main (Transducer.hs, interpreted)
Ok, modules loaded: Main.
*Main> let map = reduce . mapping
<interactive>:3:20:
Couldn't match type ‘Reducer t0 b1 -> Reducer t0 a1’
with ‘forall t. Reducer t b -> Reducer t a’
Expected type: (a1 -> b1) -> Transducer a b
Actual type: (a1 -> b1) -> Reducer t0 b1 -> Reducer t0 a1
Relevant bindings include
map :: (a1 -> b1) -> c a -> c b (bound at <interactive>:3:5)
In the second argument of ‘(.)’, namely ‘mapping’
In the expression: reduce . mapping
*Main> let map f = reduce (mapping f)
*Main> :t map
map :: Collection c => (a -> b) -> c a -> c b
तो मैं map = reduce . mapping
को परिभाषित नहीं कर सकते हैं। हालांकि, मैं map f = reduce (mapping f)
परिभाषित कर सकता हूं।
मेरा मानना है कि यह समस्या monomorphism प्रतिबंध के कारण होती है। मैं वास्तव में map f = reduce (mapping f)
के बजाय map = reduce . mapping
लिखना चाहूंगा। इसलिए, मेरे पास दो प्रश्न हैं:
- इस समस्या का कारण क्या है? क्या यह वास्तव में monomorphism प्रतिबंध है?
- मैं इस समस्या को कैसे ठीक करूं?
यह उच्च रैंक के साथ प्रकार अनुमान के कारण है। Monomorphism प्रतिबंध यहाँ कोई फर्क नहीं पड़ता। कोई आसान फिक्स नहीं, मुझे लगता है कि एक प्रकार की एनोटेशन जोड़ने या एक पॉइंटफुल परिभाषा में जाने के अलावा। – chi
एनोटेशन टाइप करें मदद नहीं करते: 'नक्शा :: संग्रह सी => (ए -> बी) -> सी ए -> सी बी; नक्शा एफ = कम (मैपिंग एफ) 'अभी भी एक ही त्रुटि उत्पन्न करता है। –
टाइप त्रुटि आपको बताती है कि समस्या क्या है। 'मैपिंग' का प्रकार चुपचाप 'फोल' को बाईं ओर ले जाने के लिए चुपचाप बदल दिया गया है ('t: t mapping'' आज़माएं। यह एक मान्य (अर्थशास्त्र-संरक्षण) परिवर्तन है, लेकिन टाइपशेकर अपेक्षा करता है कि 'ट्रांसड्यूसर ए बी' उचित प्रकार, 'रेड्यूसर टी ए -> रेड्यूसर टी बी' (जो * विशिष्ट प्रकार हो सकता है)। लेकिन जब आप 'कम (मैपिंग एफ) लिखते हैं, तो टाइपशेकर देखता है कि' मैपिंग एफ 'के अनुप्रयोग में टाइप' टॉरल टी 'होना चाहिए। Reducer टी बी -> Reducer टी ए', जो 'कम करने' के लिए एक तर्क के लिए सही प्रकार है। – user2407038