1

使用 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 不一样?

4

2 回答 2

4

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

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

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

希望能帮助到你。

于 2016-01-07T17:08:45.023 回答
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.

于 2017-10-19T08:51:08.860 回答