मैं हास्केल सीख रहा हूं और यसोद के लिए एक साधारण डीबी-बीज कार्यक्रम कर रहा था जब मैं इस व्यवहार पर ठोकर खाई, जो मुझे लगता है:
testFn :: Int -> Bool -> [Int]
testFn a b = if b then replicate 10 a else []
Yesod GHCI सत्र:
$ :t concatMap testFn [3]
concatMap testFn [3] :: Bool -> [Int]
$ (concatMap testFn [1,2,3]) True
[1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3]
किसी तरह एक मैप किए गए तर्क में प्रत्येक मैपिंग से उस दूसरे "बूल" को "बाहर" निकालने में सक्षम था।
मानक बेस प्रस्तावना GHCI सत्र इस अभिव्यक्ति को संकलित करने से भी इनकार करता है:
$ :t concatMap testFn [3]
error:
• Couldn't match type 'Bool -> [Int]' with '[b]'
Expected type: Int -> [b]
Actual type: Int -> Bool -> [Int]
• Probable cause: 'testFn' is applied to too few arguments
In the first argument of 'concatMap', namely 'testFn'
In the expression: concatMap testFn [3]
Yesod ने मोनो-ट्रैवर्सेबल लाइब्रेरी का उपयोग किया है जिसका अपना है concatMap
:
$ :t concatMap
concatMap
:: (MonoFoldable mono, Monoid m) =>
(Element mono -> m) -> mono -> m
हास्केल समझ के मेरे मौजूदा स्तर पर मैं यह पता नहीं लगा सका कि यहां प्रकार कैसे वितरित किए जाते हैं। क्या कोई मुझे समझा सकता है (जितना संभव हो उतना शुरुआती उन्मुख) यह चाल कैसे होती है? testFn
ऊपर का भाग किस Element mono
प्रकार के अनुरूप है ?