纯脚本嵌套行多态性

purescript nested row polymorphism

PureScript 示例 5.9 练习 1 和 2

我的解决方案:

type HasCity r s = { address :: { city :: String | r } | s }

livesInLA :: forall r s. HasCity r s -> Boolean
livesInLA { address: { city: "Los Angeles" } } = true
livesInLA _ = false

sameCity :: forall r s t u. HasCity r s -> HasCity t u -> Boolean
sameCity a b = a.address.city == b.address.city

问题:

forall r s t u. HasCity r s -> HasCity t u 太恶心了... 可以简化吗?

如果您想将行保留为具有可选字段,那不是真的。我可以建议的唯一轻微简化是:

forall r s. HasCity r s -> HasCity r s -> Boolean

但这将要求两个参数具有完全相同的结构(同时仍允许额外的标签),而原始类型只要求每条记录具有相等性测试中使用的字段。