Итак, у меня есть функция, которая должна иметь определенный тип.Моя реализация похожа на следующее:
f :: Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int
f t1 t2 t3 t4 t5 t6 t7 t8 t9
= filterFirst checkFunc p
where
p = findAll [1..9]
checkFunc = validate t1 t2 t3 t4 t5 t6 t7 t8 t9
Теперь есть какой-нибудь способ, которым я мог бы сократить значения t либо до , либо изменить валидацию, а затем переставить f или что-то похожее на следующее:
f :: Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int
f ts
= filterFirst checkFunc p
where
p = findAll [1..9]
checkFunc = validate ts
Способ сделать этот взгляд чище, был бы удивительным.
Редактировать: Подробнее
validate :: Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> Int -> [Int] -> Bool
validate t1 t2 t3 t4 t5 t6 t7 t8 t9 is =
[t1, t2, t3, t4, t5, t6, t7, t8, t9] == sums is
-- Calculates sums from specific indexes in list
sums :: [Int] -> [Int]
-- from https://stackoverflow.com/a/28904773/1218369
filterFirst :: (a -> Bool) -> [a] -> [a]
-- Find all possible permutations
findAll :: [a] -> [[a]]
-- Basically Data.List (permutations)
Проблема в том, что f должен иметьзначения передаются в качестве параметров.Я искал, и даже какая-то функция, которая принимает любое количество параметров и создает список, будет полезна, но я не могу найти какой-либо модуль с такой функцией.