String Haskell:用单个字符串生成列表的int列表

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”并删除“

我在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”部分,但它将保留为单个字符串。

正确的方法可能是使用类似
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"]