2011-04-19 12 views
6

क्या टीएच के कार्यों को साइड इफेक्ट्स का उपयोग करने के लिए कोई उचित तरीका है?टेम्पलेट हास्केल और आईओ

{-# LANGUAGE TemplateHaskell #-} 

module Qq where 

import System.Process 
import Language.Haskell.TH 

version = $([| (readProcess "git" ["rev-parse", "HEAD"] "") |]) 

संस्करण के प्रकार के आईओ स्ट्रिंग है: कहो, मैं एक समारोह है कि संकलन समय में Git कॉल करता है और एक संस्करण स्ट्रिंग उत्पन्न करना चाहते हैं। लेकिन संस्करण रनटाइम में पूरी तरह से दुष्प्रभावों से मुक्त है, इसका संकलन समय केवल साइड इफेक्ट्स है। UnsafePerformIO का उपयोग किए बिना रनटाइम में इसे शुद्ध करने का कोई तरीका है?

+0

jfyi, यह आपके प्रश्न से थोड़ा सा संबंधित हो सकता है: यदि आप कैबल के माध्यम से गिट से संस्करण स्ट्रिंग का अनुमान लगाना चाहते हैं तो आपको https://gist.github.com/656738 – hvr

उत्तर

7

पहला: सामान्य रूप से, जेनरेट कोड का रनटाइम प्रकार टेम्पलेट हास्केल सबएक्सप्रेस के संकलन-समय प्रकार से स्वतंत्र होता है, इसलिए रनटाइम प्रकार आईओ में होना आवश्यक नहीं है।

अब, इस कमांड को असुरक्षित पैराफॉर्मियो का उपयोग किए बिना चलाने के लिए, runIO का उपयोग करें। इसके बाद आपको बिना किसी प्रयोग के एक्सप्रप्र का निर्माण करना होगा [| |] (यह भी प्रकार की समस्या हल करता है)।

असल में, यदि आप [| |] एक आईओ गणना सम्मिलित करने के लिए, मुझे लगता है कि यह केवल गणना को सम्मिलित करेगा, इसे चलाने के लिए, वैसे भी। लेकिन यह एक अप्रासंगिक है, क्योंकि इसके बावजूद, यह करने का सही तरीका नहीं है कि आप क्या करना चाहते हैं।

+5

में रुचि हो सकती है एक अभ्यास के रूप में मैंने आने की कोशिश की यहां वर्णित कोड के साथ। शायद यह दूसरों के लिए भी उपयोगी है, इसलिए यहां यह जाता है: 'संस्करण = (स्ट्रिंग। Init) = << (runio $ readProcess "git" ["rev-parse", "HEAD"] "") "और' $ (संस्करण) 'एक अलग मॉड्यूल में कहीं भी एक स्ट्रिंग अभिव्यक्ति हो सकती है। – copton

+0

यह मेरे लिए उपयोगी था, धन्यवाद :) –

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