如何将max函数给定的Ord数转换为小数。 或者如何将具有2个约束(x::( Ord a,Fractional a)=> a)的数字转换为int?
不要担心RE
seemore :: (Fractional a) => RE b -> a -> a
seemore (a:+:b) x = seemore (a) (x) + seemore b x
seemore (a:|:b) x = max (seemore a y) (seemore b z)
where y = x
z = x
seemore (Symbol a) x = x
seemore Empty x = 0
seemore (Repeat(a)) x = 1/0
seemore (Plus(a)) x = 1/0
在“ seemore ::(Fractional a)”部分中,我需要将Ord a添加到该约束中,否则它将失败。但是,尽管没有函数将该数字转换为int,但我仍然坚持使用小数和ord的数字。理想情况下,我想要一个将ord转换为小数的函数。
答案 0 :(得分:6)
理想情况下,我想要一个将ord转换为小数的函数。
可以订购的东西比小数还多,例如。 "abcd" < "abce"
,但"abcd" / "abce"
是什么?
尽管没有函数将该数字转换为int,但我坚持使用小数和ord数。
如果大家都知道Fractional
和Ord
,那么您如何知道存在明智的-> Integer
转换呢?例如,考虑Data.Complex Double
(基本上只是一个复数)-我们可以加,减,除偶(即,它是Fractional
),但是对于{{1} }?没有一个好的定义。
目前尚不清楚您到底想达到什么目的,但是,我能想到的最接近的是添加一个toInteger (1 + i)
约束。这将为您提供所需的功能(例如RealFrac a
,truncate
,round
,ceiling
),以转换为floor
类型。