我如何用Haskell将人类语言单位写成后缀,比如“3秒”?
Ruby有一个很好的特性,可以将数字转换成其他东西,例如,对于迭代来说是我如何用Haskell将人类语言单位写成后缀,比如“3秒”?,haskell,Haskell,Ruby有一个很好的特性,可以将数字转换成其他东西,例如,对于迭代来说是3.times,对于转换成字符串来说是3.to\s 人们说Haskell很适合写自然的s 是否可以将单位写入后缀,例如,timeout=3秒?是。 您可以使用以下简单技巧来完成此操作: {-#语言灵活实例} 实例Num(整数->整数)其中 fromInteger n=\scale->n*scale--返回一个 --一个数字,然后返回一个数字 然后你可以写: 秒、分钟、小时、天::整数 秒=1000000——基本单位,例如微
3.times
,对于转换成字符串来说是3.to\s
人们说Haskell很适合写自然的s
是否可以将单位写入后缀,例如,timeout=3秒
?是。
您可以使用以下简单技巧来完成此操作:
{-#语言灵活实例}
实例Num(整数->整数)其中
fromInteger n=\scale->n*scale--返回一个
--一个数字,然后返回一个数字
然后你可以写:
秒、分钟、小时、天::整数
秒=1000000——基本单位,例如微秒
分钟=60秒
小时=60分钟
天=24小时
soon::整数
很快=2小时+4秒
这是如何工作的? 上面我们为
Integer->Integer
提供了一个Num
实例,用于接受整数并返回整数的函数
每个实现Num
并定义了其函数fromInteger
的类型都允许用数字文字表示,例如3
这意味着我们可以编写3::Integer->Integer
——这里3
是一个接受整数并返回整数的函数
因此,我们可以对它应用一个整数,例如seconds
;我们可以写3秒
,表达式的类型为Integer
更安全的类型版本 事实上,我们现在甚至可以编写
3(3::Integer)
——但这可能没有多大意义。我们可以通过使其更加类型安全来限制这一点:
newtype TimeUnit=TimeUnit整数
推导(等式、显示、数值)
实例Num(TimeUnit->TimeUnit)其中
fromInteger n=\(时间单位刻度)->时间单位(n*刻度)
秒、分钟、小时、天::时间单位
秒=时间单位1000000
分钟=60秒
小时=60分钟
天=24小时
现在我们只能将TimeUnit
类型的东西应用于数字文本
您可以对所有其他单位(如重量、距离或人)执行此操作。如果您的单位为小写,则可以使用上面给出的时间单位类型。但如果单位以大写开头,则需要为每个单位定义一个新类型或数据,并为其定义Num实例。这方面的一个例子是基本解释器
此处记录:…它既美丽又丑陋。祝贺投了赞成票。很高兴看到我将要给出的答案。:)要得出合乎逻辑的结论,请参阅软件包。为您自动管理单元真是太棒了,但它必须使用一系列扩展,错误消息非常糟糕。这非常好,因为它允许我们删除(*),然而,我们必须注意像
3x^2
…这样的表达式。因为3
和x
之间的函数应用程序比任何中缀运算符绑定得更紧密,所以在用x
乘以3
之前,不可能在没有括号的情况下将其平方。这与你期望的相反。也许你应该看看。他们使用类似于timeout=3*~seconds
。。。但是你也可以从中得到所有其他的国际单位制和前缀。