在purescript

时间:2018-11-10 07:17:53

标签: purescript

我试图查看是否有一种简单的方法来获取新类型记录的类型以放入函数签名。

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 个答案:

答案 0 :(得分:1)

您可以使用Newtype类来获取内部类型:

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

此方法无需附加注释,因为该类具有功能依赖项Newtype a b | a -> b,这意味着内部类型由外部类型唯一确定。