Haskell 接受输入列表
我想接受用户提供的5个值。但是,在我的代码(下面)中,如果我输入一个类似于Haskell 接受输入列表,haskell,Haskell,我想接受用户提供的5个值。但是,在我的代码(下面)中,如果我输入一个类似于[1,2,3,4,5]的列表,我会得到一个错误。例如,此代码仅接受[999]格式的输入 有人知道如何解决这个问题吗 putStrLn("Enter 5 binary numbers [,,] : ") input<-getLine let n=(read input)::[Int] let result = convertionTO binaryToDec n putStrLn(sho
[1,2,3,4,5]
的列表,我会得到一个错误。例如,此代码仅接受[999]
格式的输入
有人知道如何解决这个问题吗
putStrLn("Enter 5 binary numbers [,,] : ")
input<-getLine
let n=(read input)::[Int]
let result = convertionTO binaryToDec n
putStrLn(show result)
putStrLn(“输入5个二进制数[,]:”)
输入您要求使用read
将输入转换为[Int]
,因此它使用与Haskell源代码相同的规则进行转换,这意味着它们被解析为十进制数
当您想将它们解析为二进制数时,您必须编写自己的String->Int
(或者,为了允许出现错误,String->Maybe Int
)函数将它们从二进制数转换为Int
)
十进制数和二进制数之间没有区别。只有数字。十进制或二进制是数字如何表示为字符串的人工制品。您可以在整数
周围放置一个newtype
包装,使其具有自己的读取
和显示
实例。这样,您仍然可以使用列表解析器,但可以用您自己的解析器替换元素:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import Numeric ( readInt, showIntAtBase )
import Data.Char ( digitToInt, intToDigit )
import Control.Arrow ( first )
newtype BinNum = BinNum { unBinNum :: Integer }
deriving ( Eq, Ord, Num )
main = do
putStrLn "Enter 5 binary numbers [,,] :"
input <- getLine
let ns = read input :: [BinNum]
result = map unBinNum ns
putStrLn $ show result
isBinDigit :: Char -> Bool
isBinDigit c = c >= '0' && c <= '1'
readBinNum :: ReadS BinNum
readBinNum = map (first BinNum) . readInt 2 isBinDigit digitToInt
showBinNum :: BinNum -> ShowS
showBinNum = showIntAtBase 2 intToDigit . unBinNum
instance Read BinNum where
readsPrec _ = readBinNum
instance Show BinNum where
showsPrec _ = showBinNum
{-#语言泛化newtypederiving}
导入数字(readInt、ShowIntBase)
导入Data.Char(DigitPoint、intToDigit)
导入控件。箭头(第一个)
newtype BinNum=BinNum{unBinNum::Integer}
派生(Eq、Ord、Num)
main=do
putStrLn“输入5个二进制数[,]:”
输入布尔
isBinDigit c=c>='0'和&c显示
showBinNum=showIntBase 2 intToDigit。恩宾努姆
实例读取BinNum,其中
readsPrec u=readBinNum
实例Show BinNum where
showsPrec u=showBinNum
代码的读取部分(即putStrLn
后面的两行)在这里工作正常。您遇到的错误是什么?取消对--putStrLn(show n)
的注释,然后再次运行您的程序,并将从“输入5个二进制数[,]:”提示符开始的所有输出复制并粘贴到问题中。它不会给出任何错误。它不符合我的要求。我的程序所做的是从用户那里接受5个二进制数,并将它们转换为十进制数。但是我不知道如何向系统中输入5个二进制数。[1,2,3,4,5]
是一个二进制数列表吗?重新更正[111011111010,10]我承认这有点骗人,因为严格来说,读取
和显示
应该使用Haskell的类型表示,即BinNum
,而不仅仅是
。