Шелли: конвертировать строку в Шелли FilePath

Мне нужно выполнить cp_r функция из библиотеки Шелли для копирования a в b,

Тем не мение,

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

доходность

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"

как для первого, так и для второго аргумента cp_r,

Как я могу использовать String (FilePath определяется как String на любой платформе, о которой я знаю) в качестве аргумента cp_r?

Примечание: этот вопрос намеренно не требует каких-либо исследований, так как на него был дан ответ на вопрос "Стиль и ответ".

2 ответа

Решение

Подробное и официальное описание см. В разделе " Преобразование между текстом и FilePath " в Hackage.

Давайте сначала посмотрим, как это сделать с Text:

{-# LANGUAGE OverloadedStrings #-}
import Shelly

cp_r (fromText "a") (fromText "b")

С этого момента мы можем просто использовать Text.pack применить этот метод к строкам

{-# LANGUAGE OverloadedStrings #-}
import Shelly
import Data.Text

cp_r (fromText $ pack "a") (fromText $ pack "b")

Обратите внимание, что в случае, если вам также необходимо использовать FilePath от Prelude в модуле, вы должны использовать

import Shelly hiding (FilePath)

чтобы избежать конфликтов (в качестве альтернативы, вы можете использовать Prelude.FilePath а также Shelly.FilePath).

Я согласен с @Uli Kohler - вот пример такого использования:

https://github.com/haroldcarr/make-mp3-copies/blob/master/MakeMP3Copies.hs

Другие вопросы по тегам