- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下数据结构:
data TempUnit = Kelvin Float
| Celcius Float
| Fahrenheit Float
我想实现一个将温度从开尔文转换为另一个单位的函数。如何将返回类型单元传递给函数?
最佳答案
一种方法是为不同的温度单位使用 3 种不同的类型,然后使用类型类将它们“联合”为温度,例如
newtype Kelvin = Kelvin Float
newtype Celcius = Celcius Float
newtype Fahrenheit = Fahrenheit Float
class TempUnit a where
fromKelvin :: Kelvin -> a
toKelvin :: a -> Kelvin
instance TempUnit Kelvin where
fromKelvin = id
toKelvin = id
instance TempUnit Celcius where
fromKelvin (Kelvin k) = Celcius (k - 273.15)
toKelvin (Celcius c) = Kelvin (c + 273.15)
instance TempUnit Fahrenheit where
fromKelvin (Kelvin k) = Fahrenheit ((k-273.15)*1.8 + 32)
toKelvin (Fahrenheit f) = Kelvin ((f - 32)/1.8 + 273.15
现在您可以使用 toKelvin
/fromKelvin
并且将根据(推断的)返回类型选择适当的实现,例如
absoluteZeroInF :: Fahrenheit
absoluteZeroInF = fromKelvin (Kelvin 0)
(请注意使用 newtype
而不是 data
,这与 data
相同,但没有额外构造函数的运行时成本。)
该方法提供任意转换函数convert :: (TempUnit a, TempUnit b) => a -> b
自动:convert = fromKelvin . toKelvin
。在这一点上,这需要编写处理任意温度的函数的类型签名 TempUnit a => ... a
约束而不仅仅是简单的 TempUnit
.
还可以使用“哨兵”值,否则该值将被忽略,例如
fromKelvin :: TempUnit -> TempUnit -> TempUnit
fromKelvin (Kelvin _) (Kelvin k) = Kelvin k
fromKelvin (Celcius _) (Kelvin k) = Celcius (k - 273.15)
fromKelvin (Fahrenheit _) (Kelvin k) = Fahrenheit (...)
(这可能通过 @seliopou 建议的方法更好地完成:分解一个单独的 Unit
类型。)
可以像这样使用:
-- aliases for convenience
toC = Celcius 0
toK = Kelvin 0
toF = Fahrenheit 0
fromKelvin toC (Kelvin 10)
fromKelvin toF (Kelvin 10000)
请注意,此方法不是类型安全:尝试转换 Celcius 100
时会发生什么与 fromKelvin
? (即 fromKelvin toF (Celcius 100)
的值是多少?)
Kelvin
.
关于Haskell 返回类型多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14103927/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!