Подтвердить что ты не робот

Haskell охраняет функции лямбда?

Можно ли охранять функции лямбда?

Например:

\k
    | k < 0     -> "negative"
    | k == 0    -> "zero"
    | otherwise -> "positive"
4b9b3361

Ответ 1

Неа. Ближайший прямой перевод немного похож на

\k -> case () of
       _ | k < 0     -> "negative"
         | k == 0    -> "zero"
         | otherwise -> "positive"

Ответ 2

По GHC 7.6.1 есть расширение под названием MultiWayIf, которое позволяет вам написать следующее:

\k -> if
  | k < 0     -> "negative"
  | k == 0    -> "zero"
  | otherwise -> "positive"

Что, по крайней мере, более приятно смотреть на альтернативу, используя case.

Для сопоставления с образцом существует связанное расширение с именем LambdaCase:

\case
  "negative" -> -1
  "zero"     -> 0
  "positive" -> 1
  _          -> error "invalid sign"

Эти расширения не являются частью стандартного Haskell, но должны быть включены явно с помощью {-# LANGUAGE LambdaCase #-} или {-# LANGUAGE MultiWayIf #-} прагмы в верхней части файла или путем компиляции с флагом -XLambdaCase или -XMultiWayIf,

Ответ 3

Мне нравится держать лямбды короткими и приятными, чтобы не нарушать зрительный поток читателя. Для функции, определение которой является синтаксически громоздкой, чтобы гарантировать охрану, почему бы не вставить ее в предложение where?

showSign k = mysign ++ " (" ++ show k ++ ")"
  where
  mysign
    | k < 0     = "negative"
    | k == 0    = "zero"
    | otherwise = "positive"

Ответ 4

Элегантный и лаконичный способ сделать это с помощью LambdaCase:

{-# LANGUAGE LambdaCase #-}

\case k | k < 0     -> "negative"
        | k == 0    -> "zero"
        | otherwise -> "positive"

или

\case
  k | k < 0     -> "negative"
    | k == 0    -> "zero"
    | otherwise -> "positive"

Случай, когда я использовал его, чтобы поймать ошибку EOF:

{-# LANGUAGE ScopedTypeVariables #-}

o <- hGetContents e `catch` (\case (e :: IOException) | isEOFError e -> return "")