使用haskell的海龟库,如何从FilePath中提取文件名作为String?

时间:2016-01-07 15:57:28

标签: haskell haskell-turtle

使用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不同吗?

2 个答案:

答案 0 :(得分:4)

Turtle仍然使用system-filepath,它具有自定义的“FilePath”类型,您可以找到here。许多其他Haskell库将使用文件路径库,该文件路径库仅将FilePath定义为String的同义词(类型为FilePath = String)。这是IHaskell的情况。

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

system-filepath实际上已被弃用。这有一个问题。请阅读:https://github.com/Gabriel439/Haskell-Turtle-Library/issues/54

希望它有所帮助。

答案 1 :(得分:0)

正如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