Преобразование реального сложного типа в Exp / Acc

#haskell #accelerate-haskell

#haskell #ускорение -haskell

Вопрос:

Мне нужно преобразовать реальное числовое значение в типе Exp or Acc библиотеки ускорения в соответствующее Complex ему значение, например:

 toComplex :: Exp Double -> Exp (Complex Double)
toComplex' :: Acc (Vector Double) -> Acc (Vector (Complex Double))
  

Я попытался сопоставить шаблон следующим образом

 toComplex :: Exp Double -> Exp (Complex Double)
toComplex a = ((r, i) -> constant $ r :  i) $ (a, constant 0)
  

и подозреваю, что lift или unlift как в https://www.acceleratehs.org/examples/mandelbrot.html может каким-то образом решить эту проблему, но не может определить правильное их применение.

Для моей попытки ghc жалуется, что

Couldn't match typeExp Double’ with ‘Double
      Expected type: Exp (Complex Double)
        Actual type: Exp (Complex (Exp Double))
  

Комментарии:

1. Разве это не было бы чем-то вроде toComplex = lift1 (: 0) ?

2. Вы правы, я упустил из виду эту функцию подъема. toComplex = lift (: (constant 0)) решил мою проблему. Спасибо!