3

如何将连接的转换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]吗?

4

1 回答 1

6

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

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

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

于 2016-06-21T08:22:11.463 回答