Haskell 更改值succ和pred函数返回
我想定义一个泛型函数,它可以获取某个范围内的下一个值。我有以下函数定义:Haskell 更改值succ和pred函数返回,haskell,Haskell,我想定义一个泛型函数,它可以获取某个范围内的下一个值。我有以下函数定义: nextValInRange :: (Enum a) => a -> a nextValInRange = succ 上述定义的问题是,对于分数值,我想用递增的方式更改值succ函数。我希望succ增加0.2,而不是增加1.0。例如: (succ 10.0) = 10.2, not 11.0 问题是我仍然希望nextValInRange函数用于枚举类型类中的任何值 我可以写: nextValInRange
nextValInRange :: (Enum a) => a -> a
nextValInRange = succ
上述定义的问题是,对于分数值,我想用递增的方式更改值succ函数。我希望succ增加0.2,而不是增加1.0。例如:
(succ 10.0) = 10.2, not 11.0
问题是我仍然希望nextValInRange函数用于枚举类型类中的任何值
我可以写:
nextValInRange :: (Enum a, Num a) => a -> a -> a
nextValInRange stepVal rangeVal = rangeVal + stepVal
但我不想添加Num类型的类限制
是否有一些哈斯克尔巫术,我可以用来实现这一点
我能想到的另一个解决方案是有两个单独的nextValInRange函数,一个用于NUM,另一个用于普通枚举
TIA您能否修改工作方式以满足您的需求?除非您可以使用newtype,否则我希望您需要自己的多态函数或自己的类型类
是否有一些哈斯克尔巫术,我可以用来实现这一点
基本上,没有。你可以让它使用一个额外的类型类和一些可怕的语言杂注,但这可能比首先为你自己的类型类定义实例要复杂得多
我建议使用Chris建议的enumFromTo
,因为这基本上解决了您正在解决的问题
但是,您可以将nextValInRange
转换为调用者提供的函数。假设它在如下代码中使用:
makeRange :: Enum a => a -> a -> [a]
makeRange lo hi
| lo < hi = lo : makeRange (nextValInRange lo) hi
| otherwise = []
makeRange::枚举a=>a->a->[a]
makeRange lo hi
|lo
只需将隐式枚举字典传递更改为显式函数传递
makeRange :: (a -> a) -> a -> a -> [a]
makeRange mySucc lo hi
| lo < hi = lo : makeRange (mySucc lo) hi
| otherwise = []
makeRange::(a->a)->a->a->[a]
MakerRange mySucc lo hi
|lo
然后您可以为浮动传递
(+0.1)
函数,和succ
适用于您认为合适的任何类型。我不认为对分数值使用Enum
可能非常适合您的实际任务:succ$succ$succ$succ$succ$succ 10.0
由于浮点运算的不精确性,将不会计算为11.0
。你的基本任务是什么?考虑传递一个值列表而不是一个初始值。底层任务是,对于任何值,我需要能够计算下一个值。我事先不知道该范围内的所有值。我需要从当前值计算下一个值。不,你刚刚重申了你原来的问题。我问这个问题是因为我怀疑这是一个问题。我正在编写自己的范围库来处理范围。作为该库的一部分,我有必要了解范围内的特定值,该范围内的下一个值和上一个值是什么。因为这是一个通用库,所以我希望它能够使用尽可能多的值。对于say Int和normal Enum的范围,我可以使用Enum类的pred和succ函数,但是对于分形,这会变得更加复杂。这一切的原因是我还有一个函数,它可以告诉我两个范围是否相邻,两个范围之间没有“空格”。我认为我无法修改EnumFromTo的工作方式。我可能会考虑按照你的建议来实现我自己的类型类。谢谢。即使我定义了自己的类型类,每个类型实例也只能得到1个行为。我将研究newtype,看看如果使用newtype机制,代码会是什么样子。