আমি হাস্কেল শিখছি এবং ইয়েসডের জন্য একটি সাধারণ ডিবি-বীজ প্রোগ্রাম করছিলাম যখন আমি এই আচরণে হোঁচট খেয়েছি যা বুঝতে আমার অসুবিধা হয়:
testFn :: Int -> Bool -> [Int]
testFn a b = if b then replicate 10 a else []
ইয়াসোদ জিএইচসিআই অধিবেশন:
$ :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]
একরকম প্রতিটি ম্যাপিং থেকে একক ত্রি যুক্তিতে "দ্বিতীয় "টিকে" টানতে "সক্ষম হয়েছিল।
স্ট্যান্ডার্ড বেস প্রিলেড জিএইচসিআই অধিবেশন এমনকি এই প্রকাশটি সংকলন করতে অস্বীকার করেছে:
$ :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]
দেখা যাচ্ছে যে ইয়াসোদ মনো-ট্র্যাজেবল লাইব্রেরি ব্যবহার করেছে যার নিজস্ব রয়েছে concatMap
:
$ :t concatMap
concatMap
:: (MonoFoldable mono, Monoid m) =>
(Element mono -> m) -> mono -> m
হাস্কেল বোঝার আমার বর্তমান স্তরে আমি বুঝতে পারি না যে এখানে কীভাবে প্রকারগুলি বিতরণ করা হয়। কেউ আমাকে ব্যাখ্যা করতে পারে (যতটা সম্ভব প্রাথমিক দিকনির্দেশিত) কীভাবে এই কৌশলটি করা হয়? testFn
উপরের কোন অংশটি Element mono
টাইপ করে চলেছে ?