в функцию? Я нашел по крайней мере 6 возможности.
1. Использывать библиотеку Data.Optional (optional-args-1.0.2),
2. определить параметер как запись (record) и инициализировать только известные параметры в этой записи.
3. Использывать Maybe
4. определить спец класс
class Optional1 a b r where
opt1 :: (a -> b) -> a -> r
как показано здесь
https://stackoverflow.com/questions/7781096/is-there-a-better-way-to-have-optional-function-arguments-in-haskell
5. With ViewPatterns
6. передавать параметры как список
А вы как передаете опциональныйпараметер в функции?
6. https://hackage.haskell.org/package/named
8. рекорд или другая структура, а передавать state action do param1 .= value1 param2 .= value2
а я предпочитаю 2 и 3
2 и 3
ещё можно 2 вариант обогатить дефолтом адхок или https://hackage.haskell.org/package/data-default
9. раскаррировать! класс и пачка инстансов для разных кортежей аргументов. в серьёзном коде не встречал, но в принципе тоже решение
Data.Optional как раз так и работает:data Optional a = Default | Specific a instance IsString a => IsString (Optional a) instance Num a => Num (Optional a) instance Fractional a => Fractional (Optional a)
нет, я про другое совсем: class MyVariadicFunArg arg where myVariadicFun :: arg -> IO () instance MyVariadicFunArg (Int, String) ... instance MyVariadicFunArg (String, String, String) ... instance MyVariadicFunArg (Text, Handle) ...
Так это и есть почти что ViewPatterns, но определенные через класс Разве нет? Но в любом случае я попробую :?
все решения эквивалентны, а ViewPatterns — это конкретный синтаксис, использующийся, например, в named. как ViewPatterns помогают опциональные параметры передавать?
ViewPatterns — это грубо говоря сахар для let, ничего общего с классами f (g -> p) = x === f x' = x where p = g x'
https://stackoverflow.com/questions/7781096/is-there-a-better-way-to-have-optional-function-arguments-in-haskell
а, так это решение с Maybe, только присыпанное сахаром
ну там же пишут не "через view-паттерны можно сделать дефолты", а "через вью-паттерны можно дефолты указывать слева от =" дефолты там через Maybe решение там хорошее, так делает named (то плюс еще своя обвязка именованых)
да, простое и удобное
Обсуждают сегодня