Tôi mới sử dụng Haskell và có một số khó khăn trong đầu của tôi xung quanh một số khái niệm của nó.Làm thế nào để san bằng IO [[String]]?
Khi phát xung quanh với IO, tôi muốn làm phẳng một IO [[Chuỗi]].
Một ví dụ về những gì tôi đã cố gắng:
module DatabaseTestSO where
import Database.HDBC
import Database.HDBC.MySQL
import Data.Foldable
convSqlValue :: [SqlValue] -> [String]
convSqlValue xs = [ getString x | x <- xs ]
where getString value = case fromSql value of
Just x -> x
Nothing -> "Null"
listValues :: [[SqlValue]] -> [[String]]
listValues [] = []
listValues xs = [ convSqlValue x | x <- xs ]
flatten :: [[a]] -> [a]
flatten = Data.Foldable.foldl (++) []
domains :: IO [[String]]
domains =
do conn <- connectMySQL defaultMySQLConnectInfo {
mysqlHost = "hostname",
mysqlDatabase = "dbname",
mysqlUser = "username",
mysqlPassword = "pass" }
queryDomains <- quickQuery conn "SELECT name FROM domains" []
return (listValues queryDomains)
đó làm việc với [[String]]
trong GHCi như mong đợi:
*DatabaseTestSO> flatten [["blah","blab","wah"],["bloh","blob","woh"],["blih","blib","wuh"]]
["blah","blab","wah","bloh","blob","woh","blih","blib","wuh"]
nhưng không với IO [[String]]
nơi tôi nhận
*DatabaseTestSO> flatten domains
<interactive>:1:9:
Couldn't match expected type `[[a0]]'
with actual type `IO [[String]]'
In the first argument of `flatten', namely `domains'
In the expression: flatten domains
In an equation for `it': it = flatten domains
Tôi đoán tôi không thể sử dụng một chức năng được cho là tinh khiết với các loại IO? Tôi có thể chuyển đổi IO [[String]]
thành [[String]]
không? Làm cách nào để giải quyết vấn đề này một cách chính xác?
'flatten' được gọi là' concat' và được xác định trong 'Prelude'. –
Tôi hiểu. 'Prelude' được nhập tự động khi không sử dụng GHCi? –
Có (phụ ...) –