This question already has answers here:
Positive integer type

(6个答案)


2年前关闭。




说我有一个函数原型(prototype),如下所示:
func :: [Int] -> [Int]

如何仅强制使用非负整数列表作为输入参数?我必须将参数类型从[Int]更改为什么。在这个公平的时刻,它可以与func [-1,-2]一起使用,我只希望它与[1,2]一起使用,即由解释器喷出错误消息。

最佳答案

newtype NonNegative a = NonNegative a

toNonNegative :: (Num a, Ord a) => a -> NonNegative a
toNonNegative x
  | x < 0 = error "Only non-negative values are allowed."
  | otherwise = NonNegative x

fromNonNegative :: NonNegative a -> a
fromNonNegative (NonNegative x) = x

请注意不要直接使用NonNegative构造函数。如果将其放在单独的模块中而不导出,则将更加容易。

另外,现在您可以使用(映射到NonNegative)来懒惰地变换数字列表。

无论您在何处注入(inject)原始数字,这仍将需要运行时检查。

或者,您可以使用Data.Word。

关于haskell - 非负整数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2070989/

10-11 00:28