我有一个函数a -> [b]
,我正在寻找一个函数将它转换为一个类似的函数,但是列表的元素包含在一些newtype / data:a -> [t b]
中。所以我需要找到一个函数,它执行以下操作: (a -> [b]) -> (a -> [t b])
。
Hoogle将traverse
作为最接近的匹配,但这并不是我想要的。有没有办法构建我需要的函数,使用Haskell强大的类型类?
如果没有我可以管理,但代码必须更加详细,例如Boardable <$> makeBListFrom a
,其中Boardable
构造函数代表t
。
答案 0 :(得分:3)
如果您使用的是newtype
,那么您正在寻找coerce
(因为从运行时的角度来看,转换a -> [b]
到a -> [t b]
是无操作的)。当然,这只有在Haskell能够推断出你试图强迫的类型时才有效。
您获得coerce makeBListFrom :: A -> [Boardable B]
(其中A
和B
是从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]