将字符串转换为新的数据结构并返回字符串

Posted

技术标签:

【中文标题】将字符串转换为新的数据结构并返回字符串【英文标题】:Convert string into new data structure and back into string 【发布时间】:2022-01-06 04:31:29 【问题描述】:

我正在尝试使用 2 个参数创建一个新的数据结构 BigNumber:带有“+”或“-”的字符以区分正数和负数以及数字的数字列表。并在 2 个函数中使用它:将字符串转换为 BigNumber 的扫描仪和将 BigNumber 转换为字符串的输出。 这是我目前所拥有的:

data BigNumber = Char [Integer]
   
-- Verifies if the number is positive or negative and returns its correspondent char 
scanner_Sign :: Char -> Char
scanner_Sign s = if s == '-' then '-' else '+'

-- Converts string into list of digits (without signal)                
scanner_Numbers :: (Char, String) -> [Integer]
scanner_Numbers (sign, s) 
                | sign == '+' = map (read . (:"")) s :: [Integer]
                | sign == '-' = map (read . (:"")) (tail s) :: [Integer]

scanner :: String -> BigNumber
scanner = scanner_Numbers (s, n)
          where scanner_Sign (head s)

output :: BigNumber -> String
output (sign, numbers)
       | sign == '+' = show numbers
       | sign == '-' = - (show numbers)
       where (BigNumber (sign, numbers))

扫描仪的两个辅助功能都在工作,但我不知道如何主要使用它们。而且我仍然对输出功能一无所知... 我做错了什么?

【问题讨论】:

data BigNumber = Char [Integer] 并不像您认为的那样。它定义了一个类型 BigNumber,它有一个名为 Char 的构造函数(与标准类型 Char 无关),并且该构造函数包装了一个 Integers 列表。 你的其余代码也很荒谬。我建议首先确保您准确理解每段代码的实际含义以及您期望它的含义。 【参考方案1】:

我正在尝试使用 2 个参数创建一个新的数据结构 BigNumber:

这个data BigNumber = Char [Integer] 创建了一个新的数据类型,它带有一个名为Char 的构造函数,并且只有一个参数。所以要么像这样创建一个新的数据类型:

data BigNumber = BigNumber Char [Integer]

并相应地调整您的功能,或者您可以在很大程度上保留您的 output 功能

type BigNumber = (Char, [Integer])

顺便说一句,haskell 中的Integers 已经支持任意大(和负)数。您可以改用Int

扫描仪的两个辅助功能都在工作

“工作”就像“编译”一样?看来你想要

scanner_Numbers ('-', "1234") == [2,3,4]

这会删除“1”。嗯,因为你想重复第一个字符,即调用scanner_Numbers ('-', "-567")。这是不必要的。你可以这样做

 scanner ('-':s) = BigNumber '-' that-map-read-stuff-with-s
 scanner s       = BigNumber '+' that-map-read-stuff-with-s

where-clauses 的语法已关闭。您需要在那里进行定义,即它们具有 = 符号,就像***函数一样。

关于输出:

   | sign == '-' = - (show numbers)

不编译。 show 有一个签名,大致是show :: whatever -> String。所以它返回一个String,你尝试否定一个字符串。 -不是对字符串的操作!幸运的是,: 是对字符串的操作,因此请尝试在其中放置一个代表减号的字符。 说真的,在揭开剧透之前试着理解我刚刚写的内容。

| sign == '-' = '-' : (show numbers)

然后你会发现show numbers 不会产生你想要的漂亮输出。提示:类似于从 String 转换为 BigNumber 时所做的事情,反之亦然。

【讨论】:

谢谢,帮了大忙。抱歉,我的问题听起来一定很愚蠢。我已经学习了几个星期,我会变得更好。

以上是关于将字符串转换为新的数据结构并返回字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何将 1 和 0 的行转换为新的 int 列

取DataFrame中其中几列并组合存储为新的DataFrame

将旧的时间字符串转换为新的string时间字符串

如何将 Pandas DataFrame 中字典的字符串表示形式转换为新列?

将 pandas Dataframe 的行转换为可迭代的字符串列表

将“规范”S3 类转换为新的 S4 类