2011-12-19 13 views
6

मैं एक मॉड्यूल लिखना चाहता हूं जो उपयोगकर्ता द्वारा परिभाषित किए जाने वाले फ़ंक्शन का उपयोग करता है। उदाहरण के लिए:हैकेल में बाहरी कार्यों?

module A 
(someFun) where 

someFun x = doSomethingWith externFun x 

मैं चाहूँगा externFun फ़ाइल मॉड्यूल ए आयात करने में, उपयोगकर्ता द्वारा परिभाषित किया जा करने के लिए वहाँ एक रास्ता है? या यह सिर्फ एक बुरा विचार है?

मैं निश्चित रूप से कुछ फ़न के लिए एक तर्क के रूप में externFun पास कर सकता हूं, लेकिन वहां यह बहुत सुविधाजनक नहीं दिखता है: प्रत्येक कॉल के लिए कुछ फ़ंक्शन पारित होने के लिए समान होगा।

+1

डाउनवॉटर से कुछ टिप्पणियां –

उत्तर

8

अन्य उत्तरों गलत हैं: संभव है! ImplicitParams नामक एक छोटा-सा उपयोग किया गया है जो इसे करने के लिए बिल्कुल बनाया गया है। उदाहरण के लिए:

-- A.hs 
{-# LANGUAGE ImplicitParams #-} 
module A where 
someFun x = ?externFun (?externFun x) 

-- B.hs 
{-# LANGUAGE ImplicitParams #-} 
module B where 
import A 
main = print (someFun 3) where 
    ?externFun = (2*) 

GHCi में:

Prelude *B> main 
12 

देखा! Hugs manual, GHC manual, और Implicit Parameters: Dynamic Scoping with Static Types (PDF) में अधिक जानकारी।

+0

धन्यवाद में बहुत मददगार होंगी। क्या यह जाने के लिए एक अच्छा और सस्ता तरीका है? क्या फ़ंक्शन को पैरामीटर (डिज़ाइन या दक्षता के संदर्भ में) के रूप में पास करने के लिए इसका उपयोग करने के नुकसान हैं? –

+0

@flagadabla मुझे लगता है कि यह बहुत आम नहीं है, लेकिन मुझे किसी फ़ंक्शन में स्पष्ट रूप से गुजरने की तुलना में सावधान रहने के लिए किसी भी डिज़ाइन या दक्षता चिंताओं के बारे में पता नहीं है। –

0

नहीं, आपको एक तर्क के रूप में लेना चाहिए। आपको लगता है कि यह प्रत्येक कॉल के लिए समान क्यों होगा? यह किसी भी अन्य तर्क की तरह काम करता है।

6

नहीं, आप यह नहीं कर सकते हैं। इसे तर्क के रूप में पास करना रास्ता है। हालांकि, आप आंशिक आवेदन का उपयोग करके पुनरावृत्ति को खत्म कर सकते हैं। बस अन्य मॉड्यूल में कुछ इस तरह करते हैं:

import A (someFun) 
someFun' = someFun externFun 

अब आप someFun' हर जगह के बजाय का उपयोग कर सकते हैं।