2012-04-21 8 views
8

यह संभव एक समारोह isFunc :: a -> Bool लिखने के लिए निर्धारित करने के लिए किनिर्धारित करें कि क्या एक मूल्य के हास्केल में एक समारोह है

foo :: Int -> Int 
bar :: Char -> Char -> Char  

> isFunc foo 
True 
> isFunc bar 
True 
> isFunc 3 
False 
> isFunc 'a' 
False 

मैं Data.Dynamic तो मैं उपयोग कर रहा हूँ एक मनमाना मूल्य एक समारोह (किसी भी प्रकार की) है कि क्या इस तरह है अग्रिम में प्रकार निर्धारित नहीं कर सकते हैं।

+3

'isFunc' पूछने के लिए एक अच्छी तरह से गठित सवाल नहीं है बहुरूपता की उपस्थिति में। मेरे पास 'ए' प्रकार की बात है; क्या यह एक समारोह है या नहीं? जवाब तब तक अनिश्चित है जब तक कि मैंने 'ए' को एक मोनोमोर्फिक प्रकार में बदल दिया है, तब तक मैं चुन सकता हूं, उदाहरण के लिए, 'ए ~ इंट' या 'ए ~ इंट -> Int'। आपके 'isFunc 3' उदाहरण में वास्तव में यह समस्या है, और आपने शायद यह भी ध्यान नहीं दिया; आप कैसे जानते हैं कि '3' कोई फ़ंक्शन नहीं है? –

उत्तर

10

पैरामैट्रिकिटी नो कहते हैं।

a -> Bool 

का एकमात्र कार्य निरंतर कार्य है।

हालांकि, तदर्थ बहुरूपता का एक सा और थोड़ा अधिक chutzpah के साथ, आप ऐसा कर सकते हैं:

{-# LANGUAGE OverlappingInstances, FlexibleInstances #-} 

class Sick x where 
    isFunc :: x -> Bool 

instance Sick (a -> b) where 
    isFunc _ = True 

instance Sick x where 
    isFunc _ = False 

और फिर इसे जैसे आप

*Sick> isFunc 3 
False 
*Sick> isFunc id 
True 

है लग रहा है लेकिन यह की तरह प्रतीत होता है करने के लिए एक अनोखी बात है। परिणामस्वरूप Bool आपके लिए क्या उपयोग है?

+0

मैं गतिशील रूप से टाइप किए गए मानों की सूची पर मानचित्रण कर रहा हूं और उन कार्यों को एक्स लागू कर रहा हूं जो कार्य हैं। – jhibberd

+1

मुझे विश्वास नहीं है कि यह दृष्टिकोण वास्तव में उस समस्या के लिए काम करेगा - या, स्पष्ट रूप से, कि _any_ दृष्टिकोण उस समस्या के लिए काम करेगा, हास्केल में। हास्केल में टाइपक्लास उदाहरण हमेशा संकलित समय पर संकलित होते हैं, रनटाइम नहीं, और आपके द्वारा वर्णित स्थिति को रनटाइम रिज़ॉल्यूशन की आवश्यकता होती है। –

11

आप क्या पूछ रहे हैं और Data.Dynamic के साथ आपको क्या करना है, यह अलग-अलग चीजें हैं। आपको fromDyn/fromDynamic के साथ निकालने से पहले सटीक प्रकार के मूल्य को जानने की आवश्यकता है। निर्धारित करने के लिए एक समारोह Dynamic मूल्य आप TypeRep विश्लेषण करने की जरूरत होती है:

isFuncDynamic x = typeRepTyCon (dynTypeRep x) == typeRepTyCon (typeOf2 id) 

(मुझे माफ कर दो अगर यह सबसे संक्षिप्त कार्यान्वयन नहीं है।)

+0

धन्यवाद। यह फ़ंक्शन (यद्यपि मैन्युअल रूप से निर्मित) बस वही है जो मैं ढूंढ रहा था। – jhibberd

संबंधित मुद्दे