具有类型默认值的类型注释的函数组合



假设我有以下类型:

data ImageSize = ImageSize {height :: Int, width :: Int}

我现在想将其转换为 JSON 数组(出于遗留的 API 表面原因(:

instance ToJSON ImageSize where
toJSON ImageSize{..} = Array $ fromList $ Number <$> map (fromFloatDigits . fromIntegral) [height, width]

这无法编译为:

error: [-Wtype-defaults, -Werror=type-defaults]
• Defaulting the following constraints to type ‘Double’
(RealFloat a0)
arising from a use of ‘fromFloatDigits’
at lib/Filler/Filler/Filler/Filler/Filler/ImageSize.hs:14:63-77
(Num a0)
arising from a use of ‘fromIntegral’
at lib/Filler/Filler/Filler/Filler/Filler/ImageSize.hs:14:80-98
• In the first argument of ‘map’, namely ‘fromFloatDigits’
In the second argument of ‘(<$>)’, namely
‘map (fromFloatDigits . fromIntegral) [height, width]’
In the second argument of ‘($)’, namely
‘Number
<$> map (fromFloatDigits . fromIntegral) [height, width]’

此问题(微不足道(通过以下方式解决:

toJSON ImageSize{..} = Array $ fromList $ Number <$> map (fromFloatDigits) [(fromIntegral height) :: Double, (fromIntegral width)]

但这感觉非常冗长和丑陋。有没有办法将类型转换为合成?类似于(fromFloatDigits . :: Double . fromIntegral),但实际上是功能性的?

直接使用fromIntegral,无需添加额外的中间类型。

toJSON ImageSize{..} = Array $ fromList $ Number <$> map fromIntegral [height, width]

但更简单的是使用toJSON...

toJSON ImageSize{..} = toJSON [height, width]

最新更新