8

副作用を使用する場合、THの機能を安全にする適切な方法はありますか?たとえば、コンパイル時にgitを呼び出して、バージョン文字列を生成する関数が必要です。

{-# LANGUAGE TemplateHaskell #-}

module Qq where

import System.Process
import Language.Haskell.TH

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

バージョンのタイプはIO文字列です。ただし、バージョンには実行時の副作用がまったくなく、コンパイル時にのみ副作用があります。unsafePerformIOを使用せずに実行時に純粋にする方法はありますか?

4

1 に答える 1

7

まず、通常、生成されたコードのランタイムタイプは、Template Haskellサブ式のコンパイル時タイプとは無関係であるため、ランタイムタイプはIOである必要はありません。

ここで、unsafePerformIOを使用せずにこのコマンドを実行するには、runIOを使用します。次に、[|を使用せずに、自分でExprを作成する必要があります。|](これはタイプの問題も解決します)。

実際、[|を使用すると |] IO計算を挿入するには、とにかく計算を挿入するだけで、実行はしないと思います。しかし、それは関係ありません。なぜなら、それが何をするかに関係なく、それはあなたがやりたいことをする正しい方法ではないからです。

于 2011-04-19T08:24:13.140 に答える