将字符串转换为 Turtle.FilePath

Convert String to Turtle.FilePath

如何将串联的 String 转换为 Turtle FilePath?例如,以下程序尝试读取一些文本文件,将它们连接成一个新文件并删除旧文件。尽管启用了 OverloadedStrings 扩展,它似乎不起作用:

{-# LANGUAGE OverloadedStrings #-}

module Main where

import System.Environment
import System.IO
import Control.Monad
import Turtle
import Turtle.Prelude
import qualified Control.Foldl as L

main :: IO ()
main = do
  params <- getArgs
  let n             = read $ params !! 0
      k             = read $ params !! 1
  -- Some magic is done here
  -- After a while, read generated .txt files and concatenate them
  files <- fold (find (suffix ".txt") ".") L.list
  let concat = cat $ fmap input files
  output (show n ++ "-" ++ show k ++ ".txt") concat
  -- Remove old .txt files
  mapM_ rm files

抛出的错误是:

Couldn't match expected type ‘Turtle.FilePath’
                with actual type ‘[Char]’
    In the first argument of ‘output’, namely
      ‘(show n ++ "-" ++ show k ++ ".txt")’

切换到 output "example.txt" concat 就可以了。 String 不就是 [Char] 的类型别名吗?

String 只是[Char]的别名,是的。

你看到上面写着 {-# OverloadedStrings #-} 的地方了吗?这样做是让编译器在你写 文字字符串 的任何地方自动插入 fromString。它不会自动将它插入到您触摸字符串的其他任何地方,只有当它是一个字符串常量时。

如果您在构建路径的整个表达式的结果上手动调用 fromString,这可能会修复它。 (特别是,show 函数总是 returns String,而不是任何类型的重载字符串。)