以新数据类型包装函数的输出

时间:2016-12-15 00:22:32

标签: haskell typeclass coercion

我有一个函数a -> [b],我正在寻找一个函数将它转换为一个类似的函数,但是列表的元素包含在一些newtype / data:a -> [t b]中。所以我需要找到一个函数,它执行以下操作: (a -> [b]) -> (a -> [t b])

Hoogle将traverse作为最接近的匹配,但这并不是我想要的。有没有办法构建我需要的函数,使用Haskell强大的类型类?

如果没有我可以管理,但代码必须更加详细,例如Boardable <$> makeBListFrom a,其中Boardable构造函数代表t

2 个答案:

答案 0 :(得分:3)

如果您使用的是newtype,那么您正在寻找coerce(因为从运行时的角度来看,转换a -> [b]a -> [t b]是无操作的)。当然,这只有在Haskell能够推断出你试图强迫的类型时才有效。

您获得coerce makeBListFrom :: A -> [Boardable B](其中AB是从makeBListFrom :: A -> [B]确定的某些类型。

这将 data起作用。另外,如果是我,我会坚持fmap Boardable . makeBListFrom - 你的意图对于编译器和读者都是更清楚的(其中任何一个都能够合成一个类型,而不必检查一个类型。) / p>

答案 1 :(得分:1)

为什么不只是map每个元素的构造函数?

Prelude> data X a = C a deriving Show
Prelude> map C [1, 2, 3]
[C 1,C 2,C 3]
Prelude> :t map C [1, 2, 3]
map C [1, 2, 3] :: Num a => [X a]