2015-05-11 11 views
12

हास्केल में क्यों foreverहास्केल `forever` प्रकार हस्ताक्षर

forever :: Monad m => m a -> m b 

के प्रकार के हस्ताक्षर विशेष रूप से क्यों नहीं यह सिर्फ :: Monad m => m a -> m a है है? निश्चित रूप से हम जिन मोनैड पर काम कर रहे हैं, वे forever के माध्यम से आधा रास्ता नहीं बदलते हैं?

एक समारोह जैसे:

forever' :: Monad m => m a -> m a 
forever' = forever 

बिल्कुल वैसा ही काम करने के लिए लगता है।

+1

इकाई के प्रकार 'है m' और यह नहीं बदलता है। परिणाम प्रकार 'बी' क्या परिवर्तन है। –

उत्तर

14

forever का प्रकार हस्ताक्षर यह सुझाव देने के लिए तैयार किया गया है कि इसका परिणाम हमेशा के लिए चलता है। विशेष रूप से, m b (इसके वापसी मूल्य में पॉलिमॉर्फिक) की क्रिया लिखने का कोई तरीका नहीं है जो एक गैर-निचले मान को समाप्त करता है और उत्पन्न करता है। एक ही बात का सुझाव देने का एक वैकल्पिक तरीका forever' :: m a -> m Void होगा।

एक और जवाब यह कहना है कि फ़ंक्शन के लिए यह सबसे सामान्य प्रकार उपलब्ध है जैसा कि इसे परिभाषित किया गया है, इसलिए यह वह दिया गया है।

Prelude> let forever m = let x = m >> x in x 
Prelude> :t forever 
forever :: Monad m => m a -> m b 

इन दिनों, यह शायद अलग ढंग से परिभाषित किया जाना चाहिए:

forever :: Applicative f => f a -> f b 
forever a = let x = a *> x in x 
संबंधित मुद्दे