我正在嘗試創建一個帶有 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))
掃描儀的兩個輔助功能都在作業,但我不知道如何在主要功能中使用它們。而且我對輸出功能仍然一無所知......我做錯了什么?
uj5u.com熱心網友回復:
我正在嘗試使用 2 個引數創建一個新的資料結構 BigNumber:
這將data BigNumber = Char [Integer]創建一個新的資料型別,它有一個命名的建構式Char并且只有一個引數。所以要么像這樣創建一個新的資料型別:
data BigNumber = BigNumber Char [Integer]
并相應地調整您的功能,或者您可以在大多數情況下保持您的output功能
type BigNumber = (Char, [Integer])
順便說一下,Integerhaskell 中的 s 已經支持任意大(和負)數。你可以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。所以它回傳 aString并且你嘗試否定一個字串。-不是對字串的操作!幸運的是,:是對字串的操作,所以嘗試在那里放置一個表示您的減號的字符。說真的,在揭開劇透之前,試著理解我剛剛寫的東西。
| sign == '-' = '-' : (show numbers)
然后你會發現show numbers并沒有產生你想要的漂亮輸出。提示:就像您在從 String 轉換為 BigNumber 時所做的那樣,反之亦然。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/370707.html
