2016-07-02 12 views
2

Ich habe diesen Code:Pointfree Fall von

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" 

Ist es möglich, es pointfree zu machen (erhalten von der \m -> los)?

Antwort

7

Es gibt mehrere Möglichkeiten. In diesem speziellen Fall:

putStrLn . fromMaybe "Error" 

Aber das ist ein ziemlich spezieller Fall. Etwas weniger besonderes wäre, die Maybe catamorphism zu verwenden:

maybe (putStrLn "Error") putStrLn 

Viele Typen in Haskell kommen mit einem ähnlichen catamorphism, die verwendet werden können case zu vermeiden. Aber der allgemeinsten Fall ist die besondere Spracherweiterung als LambdaCase bekannt zu verwenden, die Sie

schreiben können
\case 
    Just x -> putStrLn x 
    Nothing -> putStrLn "Error" 

Im Gegensatz zu fromMaybe (die Maybe besondere ist und die Regelmäßigkeit der hier verwendeten Fälle) oder der catamorphism (die Speziell für Typen, die einen bieten), kann dies verwendet werden, um jedes Muster-passende Lambda zu anonymisieren.

+0

"Nur x -> putStrLn x" ist immer noch nicht point-free. – immibis