Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 接受输入列表_Haskell - Fatal编程技术网

Haskell 接受输入列表

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

我想接受用户提供的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(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
,而不仅仅是