String Haskell:用单个字符串生成列表的int列表
我在txt文件中有一些数据,如下所示:String Haskell:用单个字符串生成列表的int列表,string,haskell,functional-programming,String,Haskell,Functional Programming,我在txt文件中有一些数据,如下所示: [Just 3, Nothing, Just 1, Nothing] [Nothing, Nothing, Nothing, Nothing] [Nothing, Nothing, Just 4, Nothing] [Nothing, Just 3, Nothing, Nothing] 我需要的是有一个列表,其中包含作为整数的上述值 [[3,0,1,0],[0,0,0,0],....] 等等。你知道怎么做吗?我可以用0替换“nothing”并删除“
[Just 3, Nothing, Just 1, Nothing] [Nothing, Nothing, Nothing, Nothing] [Nothing, Nothing, Just 4, Nothing] [Nothing, Just 3, Nothing, Nothing]
我需要的是有一个列表,其中包含作为整数的上述值
[[3,0,1,0],[0,0,0,0],....]
等等。你知道怎么做吗?我可以用0替换“nothing”并删除“Just”部分,但它将保留为单个字符串。正确的方法可能是使用类似
Text.Parsec的解析器库。话虽如此,这里有一种快速而简陋的方法,与python程序员可能想到的方法没有什么不同。我们的想法是将输入字符串转换成read
将为我们解析的形式
{-# LANGUAGE OverloadedStrings #-}
import Prelude hiding (null)
import Data.Text (snoc, pack, unpack, splitOn, strip, null)
import Data.Maybe (fromMaybe)
import System.IO
parse :: String -> [[Maybe Int]]
parse = map read . map unpack . map (flip snoc ']') . filter (not . null) . map strip . splitOn "]" . pack
main :: IO ()
main = do
input <- readFile "myfile.txt" -- input = "[Just 3, Nothing, Just 1, Nothing] [Nothing, Nothing, Nothing, Nothing] [Nothing, Nothing, Just 4, Nothing] [Nothing, Just 3, Nothing, Nothing]"
putStrLn . show $ map (map (fromMaybe 0)) (parse input)
{-#语言重载字符串}
导入前奏隐藏(null)
导入数据.Text(snoc、pack、unpack、splitOn、strip、null)
导入数据。可能(来自可能)
导入系统.IO
解析::字符串->[[Maybe Int]]
parse=映射读取。打开地图。映射(翻转snoc']')。筛选器(非.null)。地图条。拆分“]”。打包
main::IO()
main=do
输入仅是使用读取的备用版本:
import Data.List.Split (splitOn)
import Data.Maybe (fromMaybe)
main :: IO ()
main = do
s <- readFile "lists.txt"
let xs = map (\s' -> map (fromMaybe 0) (read (s' ++ "]"))) . init . splitOn "]" $ s
print xs
init
:删除不需要的“\n”
map(\s'->map(从0开始)(读(s'+“]))
:将封闭的lambda函数应用于每个字符串元素,该函数执行以下操作:
read(s'++“])
:将缺少的']'
追加到字符串中,并将其解析到可能的列表中(Num a=>[Maybe a]
)。请注意,我们不需要显式指定read
的类型,因为GHC可以从0
中使用来推断它(见下文)
map(fromMaybe 0)
:在列表的每个元素上应用函数fromMaybe 0
,当仅为v
时返回v
;和0
,否则
这样,您可以使用read
获得整数列表,您可以将输入定义为字符串列表列表。在我的例子中,我从文件中得到一个字符串,这是主要的问题。我懂了。我会调整我的答案。这是不精确的,但看起来我仍然得到IO类型(或字符串),我需要的是[[int]]@Dominik如果你从文件中读取,就没有办法逃脱IO
,你必须在里面工作。哇,为什么?没有什么把戏?安全不是主要目标。
["[Just 3, Nothing, Just 1, Nothing"," [Nothing, Nothing, Nothing, Nothing", ..., "\n"]