С библиотекой черепахи haskell, как извлечь имя файла как String из FilePath?
При использовании takeFileName я получаю ошибку типа:
:t v
print v
:t takeFileName
takeFileName v
v :: FilePath
FilePath "/media/miguel/backup/backups"
takeFileName :: FilePath -> FilePath
Couldn't match type ‘Turtle.FilePath’ with ‘String’
Expected type: IHaskellSysIO.FilePath
Actual type: Turtle.FilePath
In the first argument of ‘takeFileName’, namely ‘v’
In the expression: takeFileName v
Это потому, что FilePath черепахи отличается от FilePath prelude?
2 ответа
Черепаха до сих пор использует system-filepath
который имеет настроенный тип "FilePath", вы можете найти здесь. Многие другие библиотеки Haskell будут использовать библиотеку filepath, которая просто определяет FilePath
как синоним для String
(введите FilePath = String). Это случай здесь с IHaskell
,
Так что да, оба типа FilePath не совпадают. Обратите внимание, что вы можете легко конвертировать Turtle.FilePath
в String
с помощью show
(потому что у типа есть экземпляр Show). Вы также можете преобразовать его в Text
с помощью fp
из модуля Turtle.Format.
system-filepath
на самом деле не рекомендуется. Есть проблема по этому поводу. Пожалуйста, прочитайте: https://github.com/Gabriel439/Haskell-Turtle-Library/issues/54
Надеюсь, поможет.
Как отмечено в комментарии miguel.negrao, вам нужно system-filepath
библиотека (устарела - но я не могу найти другое решение).
import Turtle hiding (f
import Filesystem.Path.CurrentOS (encodeString, fromText)
let f = fromText $ "/test/abc.txt" :: Turtle.FilePath
print $ encodeString f
Выше будет выводить /test/abc.txt
,