Haskell сокращает несколько параметров до одной переменной - PullRequest
0 голосов
/ 19 октября 2018

Итак, у меня есть функция, которая должна иметь определенный тип.Моя реализация похожа на следующее:

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 должен иметьзначения передаются в качестве параметров.Я искал, и даже какая-то функция, которая принимает любое количество параметров и создает список, будет полезна, но я не могу найти какой-либо модуль с такой функцией.

1 Ответ

0 голосов
/ 19 октября 2018

Во-первых, давайте перепишем это в форме, которая выглядит ближе к составлению частичного приложения filterFirst с функцией, которая фактически потребляет значения t:

f t1 t2 t3 t4 t5 t6 t7 t8 t9 = let cf = validate t1 t2 t3 t4 t5 t6 t7 t8 t9
                               in (flip filterFirst) (findAll [1..9]) cf

http://pointfree.ioзатем говорит нам, что вышесказанное эквивалентно

f = ((((((((flip filterFirst (findAll [1..9]) .) .) .) .) .) .) .) .) . validate

Многоуровневая композиция позволяет нам избежать повторения имен t в определении.

Однако я бы не сталутверждают, что это улучшение по сравнению с вашей явной версией.

...