我正在研究加密算法,我遇到类型问题
我不明白这里的类型有什么问题:
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)))
答案 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)]))