Это частично продолжение Поднять экземпляр для функции?. Однако ответ заключается в том, чтобы либо глобально определить функцию, либо переписать ее внутри цитаты. Однако мы будем часто использовать foo
с различными функциями для f
из области действия let
. Это делает практически невозможным определение нескольких глобальных версий f. Последнее решение, заключающееся в написании нашей функции в кавычках, кажется эквивалентным написанию подъема функций.
Итак, есть ли способ поднять функции, взятые в качестве аргументов, для использования в шаблонной цитате Haskell?
очень надуманный пример:
foo.hs
{-# Language TemplateHaskell #-}
import Language.Haskell.TH
foo :: (Int->Int) -> Int -> ExpQ
foo f x = [|f x|]
g :: ExpQ
g =
let
f = (\x -> x+1)
f' = (\x' -> f(x') + 1)
in foo f' 0
Не получится с:
foo.hs:5:11:
No instance for (Language.Haskell.TH.Syntax.Lift (Int -> Int))
arising from a use of ‘Language.Haskell.TH.Syntax.lift’
In the expression: Language.Haskell.TH.Syntax.lift f
In the expression:
[| f x |]
pending(rn) [x, f]
In an equation for ‘foo’:
foo f x
= [| f x |]
pending(rn) [x, f]