В вашей функции есть несколько вещей, которые не соответствуют синтаксису Haskell.Вам не хватает =
, и вы пытаетесь объявить переменные так, как это не допускает Haskell.
Я попытался изменить ваш код, чтобы он был правильным, и вот что я получил:
splitlist :: [a] -> ([a], [a])
splitlist xs = splitAt ((length xs + 1) `div` 2) xs
minMax :: [Int] -> [Int]
minMax x = if length x == 1 then
[head x, head x]
else if length x == 2 then
if (head x > (head $ tail x)) then
[(head $ tail x), head x]
else
[head x, (head $ tail x)]
else [if (minMax1!!0 < minMax2!!0) then minMax1!!0 else minMax2!!0,
if (minMax1!!1 > minMax2!!1) then minMax1!!1 else minMax2!!1]
where
listOfLists = splitlist x
list1 = fst listOfLists
list2 = snd listOfLists
minMax1 = minMax list1
minMax2 = minMax list2
Похоже, ваш алгоритм работает, как ожидалось!Это было немного сложно, потому что большинство людей обычно не пишут методы на Haskell.
Вот другая реализация, которая может быть полезна для сравнения:
minMax :: [Int] -> [Int]
minMax [] = []
minMax (x:xs) = minMax' x x xs
where
minMax' a b [] = [a, b]
minMax' a b (x:xs) = minMax' (min a x) (max b x) xs