Анонимная функция без параметра в 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
Другие вопросы по тегам