Получить записи нового типа, лежащие в основе типа в 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
, что означает, что внутренний тип однозначно определяется внешним типом.