Я пытаюсь написать преобразователь arrow, который принимает обычные функции и превращает их в вычисления абстрактных значений. . Если у нас есть стрелка «источник»,
f :: Int -> Int
f x = x + 1
то целью будет заставить f работать с поднятыми [sic?] абстрактными типами значений, в этом примере
f' :: AV Int -> AV Int
f' (Const x) = Const (f x)
-- pass along errors, since AV computation isn't always defined
-- or computable in the case of errors
f' (Error s) = Error s
-- avRep = "abstract representation". Think of symbolic math manipulation or ASTs.
f' (Abstract avRep) = AVRepPlus avRep (AVRepConst 1)
Однако, чтобы успешно реализовать эту стрелку, необходимо поднять несколько типов, чтобы иметь гетерогенные структуры данных с некоторыми конкретными и некоторыми абстрактными значениями на произвольной глубине. В итоге я добавил специальные типы для обычных конструкторов haskell, например. если
g = uncurry (+) -- i.e. g (x, y) = x + y
затем я добавляю абстрактное представление для (,), конструктор кортежа,
AVTuple :: AV a -> AV b -> AV (a, b)
и код для g поднимается до [немного развёрнутого],
g' (AVTuple (AVConst a) (AVConst b)) = (AVConst (g (a, b)))
g' (AVTuple (AVError e) _) = (AVError e)
-- symmetric case here, i.e. AVTuple _ (AVError e)
g' (AVTuple a@(AVTuple _ _) b) = -- recursive code here
То же самое нужно сделать с AVEither. Это закончится множеством дел. Есть ли хороший способ обойти это?
Я новичок в Haskell, поэтому, пожалуйста, пришлите мне ссылки или полуподробное объяснение; вероятно, самая близкая вещь, которую я читал, - это статья SYBR (отбросьте шаблонные обороты), разделы 1-3.
Огромное спасибо!
stephen tetley
кажется правильным, чтоArrow
как класс типов - это не то, что вам нужно. Однако я не могу четко следовать вашим целям. Обратите внимание, что первые два бита определенияf'
предполагают определениеAV a s
какError s | Concrete a
. Это типEither
, и те строки вашего определенияf'
делают его стандартнымfmap f
дляEither
, который мы все используем. Возможно, изучение бессмертной Typeclassopedia (haskell.org/wikiupload/8/ 85/TMR-Issue13.pdf) облегчит общение о ваших целях? Опять же, я просто развиваю замечание немногоstephen tetley
s. - person applicative   schedule 01.05.2011