Типы не совпадают. Действительно, в вашей функции:
lnko :: Integer -> Integer -> Integer
lnko a b = <b>[</b>n | n <- [1..max(a b)], (n `divides` a) && (n `divides` b) <b>]</b>
Вы здесь возвращаете список, поскольку используете его понимание. Кроме того, вы допустили некоторые синтаксические ошибки. Например, max (a b)
означает, что вы выполняете приложение функции с a
в качестве функции и b
в качестве параметра. Это должно быть max a b
.
. Вы можете переписать это следующим образом:
lnko :: Integer -> Integer -> Integer
lnko a b = <b>maximum</b> [n | n <- [1..<b>min a b</b>], n `divides` a, n `divides` b ]
Но, тем не менее, здесь вы используете метод, при котором вы перебираете все возможные делители, чтобы найти самый большой. Например, вы можете использовать евклидов алгоритм [wiki] , который обычно превосходит линейный поиск:
lnko :: Integral i => i -> i -> i
lnko a 0 = a
lnko a b = lnko b (mod a b)
Это также будет более безопасно, например, еслиВы используете отрицательные числа в параметрах.