С библиотекой черепахи 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,

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