使用 haskell 的 turtle 库,如何从 FilePath 中提取文件名作为字符串?

With haskell's turtle library, how to extract filename as String from 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

是因为turtle的FilePath和prelude的FilePath不一样吗?

Turtle 仍然使用 system-filepath,它有一个自定义的 "FilePath" 类型,您可以找到 here。许多其他 Haskell 库会使用一个文件路径库,它只是将 FilePath 定义为 String 的同义词(类型 FilePath = String)。 IHaskell.

就是这种情况

是的,两种 FilePath 类型都不匹配。请注意,您可以使用 show 轻松地将 Turtle.FilePath 转换为 String(因为该类型具有 Show 实例)。您还可以使用 Turtle.Format 模块中的 fp 将其转换为 Text

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.