>>330
{-# OPTIONS_GHC -XFlexibleInstances #-}
module Main where

import GHC
import GHC.Paths ( libdir )
import DynFlags ( defaultDynFlags )
import Data.Dynamic
import System.IO.Unsafe

main = getLine >>= \s -> print (map (eval s) [0..10])

eval :: String -> (Int -> Int)
eval s = flip fromDyn (error "Error") $ unsafePerformIO $
defaultErrorHandler defaultDynFlags $ do {
; runGhc (Just libdir) $ do {
; dflags <- getSessionDynFlags
; setSessionDynFlags dflags
; pm <- findModule (mkModuleName "Prelude") Nothing
; setContext [] [pm]
; dynCompileExpr ("(" ++ s ++ ") :: Int -> Int")
}
}

GHCなら、こういうこともできるよ。
ただ、多相型を扱えない/扱いにくい関係で、>>328みたいな方法で押し切った方が簡単だし、応用しやすいと思う。

Haskell的にはスマートじゃない感じだけど、そもそもLispのevalにしてもPythonやRubyの似たような関数にしてもインタプリタだからできることであって、インタプリタと連携させる前提で比較しないと不公平という気もする。