找不到这里的类型有什么问题

时间:2012-01-03 18:48:34

标签: haskell

我正在研究加密算法,我遇到类型问题

我不明白这里的类型有什么问题:

multien :: [(Integer , Integer)] -> Integer
multien [] = 1
multien ((x,y):z) = y* multien z

enchelper2 :: [(Integer, Integer)] -> Integer -> Integer

问题出现在(z:((mod x y),y))表达式的

Couldn't match expected type (Integer , Integer) with actual Type [(Integer, Integer)]

在enchelper方法中的z我在这里传递了它作为[](空集)错误在列40中

enchelper :: Integer -> [Integer] -> [(Integer, Integer)] -> [(Integer, Integer)]
enchelper x (y:ys) z = if((enchelper2 (z:((mod x y),y)) (multien z:((mod x y),y))) == x) then z:[] else (z:((mod x y),y):(enchelper x ys z:((mod x y),y)))

2 个答案:

答案 0 :(得分:2)

在这段代码中

z : (mod x y, y)

类型是

x :: Integer
y :: Integer
z :: [(Integer, Integer)]
(mod x y, y) :: (Integer, Integer)

请注意

(:) :: a -> [a] -> [a]

所以也许你应该有

(mod x y, y) : z

后面的行中有类似的错误。

答案 1 :(得分:1)

问题似乎在于您使用cons运算符。 z是两个整数的元组列表,所以如果您真的想要z 之前 ((mod x y),y),那么您想要使用的是{{1}运算符,后跟一个列表。

尝试使用此尺寸:

++

或者,更具可读性:

enchelper :: Integer -> [Integer] -> [(Integer, Integer)] -> [(Integer, Integer)]
enchelper x (y:ys) z = if((enchelper2 (z++[((mod x y),y)]) (multien (z++[((mod x y),y)]))) == x) then z else (z++[((mod x y),y)])++(enchelper x ys (z++[((mod x y),y)]))