将字符串转换为 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
,而不是任何类型的重载字符串。)
如何将串联的 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
,而不是任何类型的重载字符串。)