У меня проблемы с пониманием ошибки Хаскелла, когда я перемещаю функцию Data.List maximum
по разным частям моего кода.Я использую несколько встроенных функций, чтобы найти режим произвольного списка целых чисел.Например, когда mode
дан список list = [1,2,3,4,5,5,6,6,5,5,4,4,3,4,5,6,7,8,6,5,3,2,5]
, он должен вернуть 5
.
Когда я помещаю встроенную функцию maximum
в мою функцию mode
следующим образом:
mode l = case l of
[] -> []
(x : xs) ->
let x = map length (group (sort l))
y = map head (group (sort l))
in snd (maximum (zip x y)) --<-----<-----<-- This Line
и я запускаю mode
на вышеупомянутом list
с командой> mode list
в ghci
, это выдает мне следующую ошибку:
<interactive>:2:7: error:
* Couldn't match type `Integer' with `[a]'
Expected type: [[a]]
Actual type: [Integer]
* In the first argument of mode', namely `list'
In the expression: mode' list
In an equation for `it': it = mode' list
* Relevant bindings include it :: [a] (bound at <interactive>:2:1)
Однако, когда я разделил функцию mode
на mode
и mode'
(при максимальном выполнении mode'
) примерно так:
mode' f l = snd (maximum (f l)) --<-----<-----<-- Now Here
mode l = case l of
[] -> []
(x : xs) ->
let x = map length (group (sort l))
y = map head (group (sort l))
in zip x y
и я запускаю mode
на вышеупомянутом list
с> mode' mode list
в ghci
я получаю ожидаемый вывод 5
без ошибок.
Кто-нибудь может объяснить, почему это так?