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

Convert string into new data structure and back into string

我正在尝试创建一个带有 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))

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

I'm trying to create a new data structure BigNumber with 2 arguments:

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

data BigNumber = BigNumber Char [Integer]

并相应地调整您的功能,或者您可以将 output 功能大部分保留为

type BigNumber = (Char, [Integer])

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

Both the aux functions for scanner are working

在“编译”中“工作”?看来你想要

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 子句语法不正确。您需要在那里定义,即它们有一个 = 符号,就像顶级函数一样。

关于输出:

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

不编译。 show 有一个签名,大致 show :: whatever -> String。所以它 returns 一个 String 并且你试图否定一个字符串。 -不是对字符串的操作!幸运的是, : 是对字符串的操作,因此请尝试将代表您的减号的字符放在那里。 说真的,在揭开剧透之前,试着理解我刚刚写的东西。

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

然后你会发现 show numbers 没有产生你想要的漂亮输出。提示:就像您在从 String 转换为 BigNumber 时所做的那样,恰恰相反。