2016-07-02 5 views
2

У меня есть этот код:Pointfree случай

import Control.Lens 
import Control.Monad 
import Control.Arrow 
import Text.Read 

... IO (Maybe String) ... 
    >>= \m -> case m of 
     Just x -> putStrLn x 
     Nothing -> putStrLn "Error" 

Можно ли сделать это pointfree (избавиться от \m ->)?

ответ

7

Существует несколько способов. В данном конкретном случае:

putStrLn . fromMaybe "Error" 

Но это довольно частный случай. Чуть менее специальный будет использовать Maybe катаморфизма:

maybe (putStrLn "Error") putStrLn 

Многих типов в Haskell приходят с подобным катаморфизмом, которые могут быть использованы, чтобы избежать case. Но самый общий случай использовать специальное расширение языка, известного как LambdaCase, который позволяет писать

\case 
    Just x -> putStrLn x 
    Nothing -> putStrLn "Error" 

В отличие от fromMaybe (который специально для Maybe и регулярности случаев, используемых здесь) или катаморфизм (который специально для типов, которые предоставляют один), это можно использовать для анонимизации любой лямбды, соответствующей шаблону.

+0

«Просто x -> putStrLn x» по-прежнему не является точечным. – immibis