如何将连接的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]
的类型别名吗?
答案 0 :(得分:6)
String
只是[Char]
的别名,是的。
你看到{-# OverloadedStrings #-}
的位置?这样做会使编译器在您编写文字字符串的任何地方自动插入fromString
。只有当它是一个字符串常量时,不会自动将其插入到其他任何地方。
如果您手动调用fromString
整个表达式的结果来构建路径,那么可能会修复它。 (特别是,show
函数始终返回String
,而不是任何类型的重载字符串。)