gpt4 book ai didi

haskell - 是否有等效于 F# 测量单位的 Haskell?

转载 作者:行者123 更新时间:2023-12-03 20:16:44 25 4
gpt4 key购买 nike

F# 具有度量单位功能,在 http://msdn.microsoft.com/en-us/library/dd233243.aspx 中进行了描述如下:

[<Measure>] type unit-name [ = measure ]

这允许定义单位,例如:

type [<Measure>] USD
type [<Measure>] EUR

以及要写成的代码:

let dollars = 25.0<USD>
let euros = 25.0<EUR>

// Results in an error as the units differ
if dollars > euros then printfn "Greater!"

它还处理转换(我猜这意味着 Measure 定义了一些函数,可以让Measures 进行乘法、除法和取幂):

// Mass, grams.
[<Measure>] type g
// Mass, kilograms.
[<Measure>] type kg

let gramsPerKilogram: float<g kg^-1> = 1000.0<g/kg>

let convertGramsToKilograms (x: float<g>) = x / gramsPerKilogram

我的直觉告诉我应该可以在 Haskell 中实现类似的功能,但我无法找到任何示例来说明如何做到这一点。

编辑:哦,我的话,这是一个巨大的蠕虫 jar 头! http://research.microsoft.com/en-us/um/people/akenn/units/CEFP09TypesForUnitsOfMeasure.pdf 上有一篇研究论文.我猜想实现整个事情不仅仅是几行代码。夏季项目有人吗? :)

最佳答案

将数字包装在一个新类型中并给它们一个 Num实例。

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

newtype GBP n = GBP n deriving (Show, Num, Eq, Ord)
newtype USD n = USD n deriving (Show, Num, Eq, Ord)

用法:
ghci> let a1 = GBP 2
ghci> let a2 = GBP 5
ghci> a1 + a2
GBP 7
ghci> let b1 = USD 3
ghci> let b2 = USD 6
ghci> b1 + b2
USD 9
ghci> a1 + b2 -- should be an error for mixing currencies

<interactive>:8:6:
Couldn't match expected type `GBP Integer'
with actual type `USD Integer'
In the second argument of `(+)', namely `b2'
In the expression: a1 + b2
In an equation for `it': it = a1 + b2

关于haskell - 是否有等效于 F# 测量单位的 Haskell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17045032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com