Home > Mobile >  Pattern Maching IO variables in haskell
Pattern Maching IO variables in haskell

Time:10-25

Currently I have a function getFP :: IO [String] -> Maybe (FilePath). What I want to do is something equivalent for getFP [] = Nothing if the argument was a non IO string. How could I do this? Thank you :p

CodePudding user response:

IO [String] is an action that can produce [String]. There’s no way to convert it to a pure value Maybe FilePath, but you can easily combine it with a pure function to get another action. One way is to write it out in do notation. For example, suppose you want the first path:

getFP :: IO [String] -> IO (Maybe FilePath)
getFP action = do
  strings <- action
  case strings of
    path : _ -> pure (Just path)
    [] -> pure Nothing

This might be used like getFP loadPaths where loadPaths is some action like lines <$> readFile "paths.txt" that returns a list of file paths. However, it’s more common to take a pure value as an argument instead of an action, if you’re just going to run that action immediately anyway.

getFP :: [String] -> IO (Maybe FilePath)
getFP strings =
  case strings of
    path : _ -> pure (Just path)
    [] -> pure Nothing

That would be called as getFP =<< loadPaths.

Now there’s no need for IO in getFP, since the only IO action it uses is pure.

getFP :: [String] -> Maybe FilePath
getFP strings =
  case strings of
    path : _ -> Just path
    [] -> Nothing

This can be used like getFP <$> loadPaths. (Furthermore, in this example it’s now equivalent to the standard function listToMaybe from Data.List.)

  • Related