Я работаю с библиотекой sop-core и хочу написать функцию со следующим типом:
patch :: NS I xs -> NP Maybe xs -> NP Maybe xs
xs
- это список типов на уровне типа, например '[Int,Char,Bool]
. I
- это функтор тождества. NS I xs
- это тип n-арной суммы. NP Maybe xs
- это n-арный продукт, в котором каждый компонент может существовать, а может и не существовать.
patch
должен взять значение из n-арной суммы и заполнить соответствующий слот n-арного продукта, перезаписав его, если он уже существует. Например:
patched :: NP Maybe '[Int,Char,Bool]
patched = patch (Z (I 3)) (Nothing :* Nothing :* Nothing :* Nil)
-- patched == Just 3 :* Nothing :* Nothing :* Nil
Я подозреваю, что решение может включать injections
, но я в тупике.