将字符串转换为新的数据结构并返回字符串
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 时所做的那样,恰恰相反。
我正在尝试创建一个带有 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 时所做的那样,恰恰相反。