Search code examples
haskellshelly

Shelly: Convert String to Shelly FilePath


I need to execute the cp_r function from the Shelly library to copy a to b.

However,

import Shelly
main = do cp_r "a" "b"

yields

Couldn't match expected type `Shelly.FilePath'
            with actual type `[Char]'
In the first argument of `cp_r', namely `"a"'
In the expression: cp_r "a" "b"
In an equation for `it': it = cp_r "a" "b"

for both the first and the second argument to cp_r.

How can I use String (FilePath is defined as String on any platform I know of) as argument to cp_r?

Note: This question intentionally does not show any research effort as it was answered Q&A-Style.


Solution

  • For a detailed and official description, see the convert between Text and FilePath section on Hackage.

    Let's first see how to do it with Text:

    {-# LANGUAGE OverloadedStrings #-}
    import Shelly
    
    cp_r (fromText "a") (fromText "b")
    

    From here on, we can just use Text.pack to apply this method to strings

    {-# LANGUAGE OverloadedStrings #-}
    import Shelly
    import Data.Text
    
    cp_r (fromText $ pack "a") (fromText $ pack "b")
    

    Note that in case you also need to use the FilePath from Prelude in a module, you need to use

    import Shelly hiding (FilePath)
    

    to avoid conflicts (alternatively, you could use Prelude.FilePath and Shelly.FilePath).