首页 > 解决方案 > 将 Ord 转换为小数

问题描述

如何将 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 添加到该约束中,否则它会失败。但是后来我被一个小数和 ord 的数字困住了,尽管没有函数可以将该数字转换为 int。理想情况下,我想要一个将 ord 转换为小数的函数。

标签: haskell

解决方案


理想情况下,我想要一个将 ord 转换为小数的函数。

可以订购比分数更多的东西,例如。"abcd" < "abce",但什么是"abcd" / "abce"

尽管没有将该数字转换为 int 的函数,但我仍然坚持使用分数和 ord 的数字。

如果你都知道 is Fractionaland Ord,你怎么知道-> Integer存在一个合理的转换?例如,考虑Data.Complex Double(基本上只是一个复数) - 我们可以加、减、除偶数(即它是Fractional),但是作为答案的数学意义是toInteger (1 + i)什么?没有一个好的定义。

目前尚不清楚您到底想要实现什么,但是,我能想到的最接近的是,添加一个RealFrac a约束。这将为您提供转换为类型所需的功能(例如truncate, round, ceiling, )。floorIntegral


推荐阅读