答案 0 :(得分:4)
如果要删除前两个参数,在Haskell中需要一个类型类。
class IsUnit a where
getSUnit :: SUnit a
instance IsUnit Celsius where getSUnit = SCelsius
instance IsUnit Kelvin where getSUnit = SKelvin
convertShort :: (IsUnit fromUnit, IsUnit toUnit) => Value fromUnit -> Value toUnit
convertShort = convert getSUnit getSUnit
请注意,这会使代码更长,而不是更短 - 但它允许调用者省略第一个单例值。
上述代码还假设每个单元都可以转换为任何其他单元,这是不现实的。原始代码也包含此问题。如果不需要,可以使用双参数类型:
class C from to where convert :: Value from -> Value to
instance C Kelvin Celsius where ...
-- etc.