将String转换为Turtle.FilePath

时间:2016-06-21 08:16:09

标签: haskell haskell-turtle

如何将连接的String转换为海龟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]的类型别名吗?

1 个答案:

答案 0 :(得分:6)

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

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

如果您手动调用fromString整个表达式的结果来构建路径,那么可能会修复它。 (特别是,show函数始终返回String,而不是任何类型的重载字符串。)