【发布时间】:2014-05-12 18:26:35
【问题描述】:
是否可以在 Haskell98 或扩展以下函数 f 中编写代码?
f :: (a -> b) -> (b -> a) -> c -> d
where (c,d) :: (a,b) || (c,d) :: (b,a)
我正在尝试创建一些通用函数来在a 和b 的任意两种类型之间进行转换,但我很难同时处理这两种类型的任意性。然而,它们立即由第一个参数a ->b 设置,所以我希望这是可能的。任何指导表示赞赏...
谢谢!
[编辑]
在我看来,我的问题归结为haskell的类型系统是否支持or关键字...因为我的函数的直观签名是:f :: (a->b) -> (b->a) -> a -> b or (a->b) -> (b->a) -> b -> a...
【问题讨论】:
-
您能详细说明您希望如何使用这样的功能吗?
-
实现更简洁的代码。大多数在
a ->b类型之间转换的函数要么是完全刚性的,要么仅在一种类型上是多态的。我可以用类型类来实现后者,但这次我不知道该怎么做。我想我可以使用多参数类型类并声明Instance a b,也许... -
这是为什么呢?在任何给定的情况下,您似乎都知道您正在应用转换 int 的哪个方向,并且可以酌情使用
a2b或b2a:您唯一使用convertAB的时间是您不确定时您在哪个方向进行转换,这似乎是个坏主意。 -
这和镜头包中使用isos有很大关系。我建议去那里看看,但要注意它可能是一个非常复杂的学习库。
-
我不认为它会使代码更干净。一方面,你摆脱了一个名字;另一方面,您需要更多上下文来猜测函数在使用它读取代码时正在做什么。损失大于收益 IMO。
标签: haskell polymorphism