สิ่งหนึ่งที่ทำให้สับสนคือฟังก์ชั่น "ที่เป็นที่นิยม" ชอบbind
และให้<*>
ความสำคัญกับ Praxis แต่เพื่อให้เข้าใจแนวคิดมันง่ายกว่าที่จะดูฟังก์ชั่นอื่นก่อน นอกจากนี้ยังเป็นที่น่าสังเกตว่าพระสงฆ์โดดเด่นเพราะพวกเขามีน้ำหนักมากเกินไปเมื่อเทียบกับแนวคิดที่เชื่อมโยงอื่น ๆ ดังนั้นฉันจะเริ่มด้วยฟังก์ชั่นแทน
Functors มีฟังก์ชั่น (ในสัญกรณ์ fmap :: (Functor f) => (a -> b) -> f a -> f b
Haskell) คุณมีบริบทf
ที่คุณสามารถยกฟังก์ชันขึ้นมาได้ อย่างที่คุณจินตนาการได้ว่าเกือบทุกอย่างเป็นนักแสดง รายการ, บางที, อย่างใดอย่างหนึ่ง, ฟังก์ชั่น, I / O, สิ่งอันดับ, ตัวแยกวิเคราะห์ ... แต่ละรายการแสดงถึงบริบทที่ค่าสามารถปรากฏขึ้น ดังนั้นคุณสามารถเขียนมากหลากหลายฟังก์ชั่นที่ทำงานในเกือบทุกบริบทโดยใช้หรือตัวแปรแบบอินไลน์ของมันfmap
<$>
คุณต้องการทำอะไรกับบริบทอื่นอีกบ้าง คุณอาจต้องการรวมสองบริบท ดังนั้นคุณอาจต้องการที่จะได้รับลักษณะทั่วไปของตัวอย่างเช่นนี้zip :: [a] -> [b] -> [(a,b)]
pair :: (Monoidal f) => f a -> f b -> f (a,b)
แต่เพราะมันมีประโยชน์มากขึ้นในทางปฏิบัติห้องสมุด Haskell แทนที่จะนำเสนอApplicative
ซึ่งเป็นส่วนผสมของFunctor
และMonoidal
และยังUnit
ซึ่งเพียงแค่เพิ่มที่คุณสามารถใส่จริงค่า "ภายใน" unit
บริบทของคุณด้วย
คุณสามารถเขียนฟังก์ชั่นที่ธรรมดามากโดยเพียงระบุสามสิ่งเหล่านี้เกี่ยวกับบริบทที่คุณกำลังทำงาน
Monad
เป็นเพียงอีกสิ่งหนึ่งที่คุณสามารถระบุได้ สิ่งที่ฉันไม่ได้พูดถึงก่อนหน้านี้คือคุณมีสองวิธีในการรวมสองบริบท: คุณไม่สามารถทำได้เพียงpair
แต่คุณยังสามารถเรียงซ้อนได้เช่นคุณสามารถมีรายการได้ ในบริบทของ I / O ตัวอย่างจะดำเนินการ I / O ที่สามารถอ่านการกระทำอื่น ๆ ของ I / O FilePath -> IO (IO a)
จากแฟ้มดังนั้นคุณจะต้องพิมพ์ เราจะกำจัดการสแต็กนั้นเพื่อให้ได้ฟังก์ชั่นการปฏิบัติการได้IO a
อย่างไร? นั่นคือสิ่งที่Monad
s เข้าjoin
มาช่วยให้เราสามารถรวมบริบทที่ซ้อนกันสองประเภทเดียวกัน เช่นเดียวกันสำหรับ parsers อาจจะเป็น ฯลฯ และbind
เป็นเพียงวิธีที่ใช้งานได้จริงjoin
ดังนั้นบริบทของ monadic เพียงเสนอสี่สิ่งและสามารถใช้ได้กับเครื่องจักรเกือบทั้งหมดที่พัฒนาขึ้นสำหรับ I / O สำหรับ parsers สำหรับความล้มเหลว ฯลฯ