Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 更改值succ和pred函数返回_Haskell - Fatal编程技术网

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机制,代码会是什么样子。