Наиболее прямым ответом на ваш вопрос является то, что вы можете isDivisible_x_or_y
взять два фактора, а затем использовать карри для передачи частично примененной функции в Array.filter
.
То есть вы можете определитьisDivisible_x_or_y
вот так (я также удалил синтаксис if True then True else False
и просто возвращаю выражение напрямую):
isDivisible_x_or_y x y val =
val % x == 0 || val % y == 0
Каррирование - это возможность предоставить только некоторые параметры функции и получить обратнофункция, которая принимает остальные параметры.Итак, определение типа isDivisible_x_or_y
равно Int -> Int -> Int -> Bool
(то есть принимает три Int
значения и возвращает Bool
).Если мы предоставим значения для аргументов x
и y
(например, isDivisible_x_y 3 5
), мы получим функцию с определением типа Int -> Bool
.Это тип, ожидаемый для Array.filter
.
Рабочий пример можно посмотреть по адресу https://ellie -app.com / sdxWFL9ynka1
Еще пара замечаний:
List
встречается гораздо чаще, чем Array
в вязе.Вы можете использовать Array
, только если вам нужно получить элементы по определенным индексам.Вместо Array.initialize
вы можете использовать List.range
Использование оператора конвейера |>
часто может сделать ваш код намного проще для чтения.Вместо text (toString (getValue))
у вас есть getValue |> toString |> text
, который теперь находится в порядке выполнения операций и не имеет лишних скобок.Вся эта программа может быть одним простым конвейером (хотя во многих случаях помещение всего в один конвейер может быть чрезмерным):
main =
List.range 0 max_z
|> List.filter (isDivisible_x_or_y 3 5)
|> toString
|> text
isDivisible_x_or_y x y val =
val % x == 0 || val % y == 0