TemplateHaskell и IO - PullRequest
       3

TemplateHaskell и IO

6 голосов
/ 19 апреля 2011

Есть ли какой-нибудь правильный способ сделать функции TH безопасными, если они используют побочные эффекты? Скажем, я хочу иметь функцию, которая вызывает git во время компиляции и генерирует строку версии:

{-# LANGUAGE TemplateHaskell #-}

module Qq where

import System.Process
import Language.Haskell.TH

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

тип версии - IO String. Но версия полностью свободна от побочных эффектов во время выполнения, он имеет побочные эффекты только во время компиляции. Есть ли способ сделать его чистым во время выполнения без использования unsafePerformIO?

1 Ответ

7 голосов
/ 19 апреля 2011

Первое: обычно тип времени выполнения сгенерированного кода не зависит от типа времени компиляции подвыражений Template Haskell, поэтому тип времени выполнения не обязательно должен быть в IO.

Теперьвыполните эту команду без использования unsafePerformIO, используйте runIO .Затем вам нужно будет создать Expr самостоятельно, не используя [||] (это также решает проблему типов).

На самом деле, если вы используете [||] чтобы вставить вычисление ввода-вывода, я думаю, что оно вставит только вычисление, но не запустит его.Но это не имеет значения, потому что независимо от того, что он делает, это не правильный способ делать то, что вы хотите делать.

...