Получить записи нового типа, лежащие в основе типа в purescript - PullRequest
0 голосов
/ 10 ноября 2018

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

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 10 ноября 2018

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

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

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

...