Получить записи нового типа, лежащие в основе типа в purescript

Я пытаюсь выяснить, есть ли простой способ получить тип записи newtype для добавления в сигнатуры функций.

newtype T1 = T1 { foo:: Int}
derive instance newtypeT1 :: Newtype T1 _ 
... other classes that require me to newtype the record ...

Я знаю, что могу получить доступ к записям участников с _.property и я могу сочинить это с развернутьunwrap >>> _.property чтобы получить функцию для этого свойства, но я хотел бы написать функцию, аналогичную

testFoo :: forall a. (_ -> a) -> Effect a
testFoo accessor = (unwrap >>> accessor) <$> loadT1

Это работает, но подстановочный знак выдает предупреждение, но я не уверен, как получить это определение записи из T1. (Это минимальный пример, у меня есть массивный объект свойства из внешнего источника.

Обходной путь, который я использовал в настоящее время, состоял в том, чтобы объявить мой тип как

 type InnerT1 = { foo ::Int}
 newtype T1 = T1 InnerT1

и экспорт этого InnerT1, чтобы его можно было использовать в моем тестовом файле, но это кажется немного неуклюжим, и мне интересно, есть ли лучший способ?

1 ответ

Решение

Вы можете использовать Newtype класс для получения по внутреннему типу:

testFoo :: forall a inner. Newtype T1 inner => (inner -> a) -> Effect a 
testFoo accessor = (unwrap >>> accessor) <$> loadT1

Это работает без дополнительных аннотаций, потому что класс имеет функциональную зависимость Newtype a b | a -> b, что означает, что внутренний тип однозначно определяется внешним типом.

Другие вопросы по тегам