Ох уж эти ваши хаскели. Захотел простую опцию в командную строку запилить. Гуглом нашёл имеющийся из коробки System.Console.GetOpt
. Читаю (и пытаюсь адаптировать) второй пример внизу:
...
(o,n,[] ) -> return (foldl (flip id) defaultOptions o, n)
...
Что за flip id
?
λ> :type flip
flip :: (a -> b -> c) -> b -> a -> c
λ> :type id
id :: a -> a
λ> :type (flip id)
(flip id) :: b -> (b -> c) -> c
Поломал 10 минут голову пока примерно не понял что происходит. Ну, ок, идём дальше:
(OptArg ((\ f opts -> opts { optOutput = Just f }) . fromMaybe "output")
Что за fromMaybe "output"
? То мы сверху defaultOptions делаем, то мы снова делаем что-то подобное им, только ещё и неясно зачем "output". Убрал fromMaybe
-часть, поборолся с компилятором и понял, что эта "магия" именно потому, что там у нас уже точно будет Just значение, но мы всё равно получим Maybe foo. Короче чисто чтоб компилятор успокоить.
В общем, люблю хаскель, с пользой поупражнялся в типах.