Анонимная функция без параметра в Haskell
Могу ли я определить анонимную функцию без параметра в Haskell?
У меня есть блок кода повторяется в нескольких ветках. Этот код ссылается на несколько значений снаружи.
Цель 0: определить функцию, выполняющую работу в codeBlock.
Цель 1: не повторять codeBlock дважды.
Цель 2: не передавать d1..d4 функции. Избегайте передачи файлов и времени еще лучше.
f event d1 d2 d3 d4 =
case event of
(Modified file time) -> do
codeBlock file time d1 d2 d3 d4
(Added file time) -> do
codeBlock file time d1 d2 d3 d44
_ -> return ()
1 ответ
Нет такой вещи как функция без параметров (анонимная или иная). Это просто значение (а в Haskell такие действия, как main :: IO ()
тоже просто ценности).
Конечно, значение может быть определено где угодно (например, функция); однако, если вы хотите использовать его более чем в одном месте, вы не должны делать его анонимным, а давать ему (локально ограниченное) имя:
f event d1 d2 d3 d4 =
case event of
(Modified file time) -> do
defaultAction time
(Added file time) -> do
defaultAction time
_ -> return ()
where defaultAction time = do
codeBlock file time d1 d2 d3 d4
КСТАТИ, do
блоки только с одним оператором эквивалентны только этому утверждению, то есть вы также можете написать
f event d1 d2 d3 d4 =
case event of
(Modified file time) -> defaultAction time
(Added file time) -> defaultAction time
_ -> return ()
where defaultAction time = codeBlock file time d1 d2 d3 d4