Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
String 从字符串中的数字中获取产品_String_Haskell_Type Conversion_Product - Fatal编程技术网

String 从字符串中的数字中获取产品

String 从字符串中的数字中获取产品,string,haskell,type-conversion,product,String,Haskell,Type Conversion,Product,例如,如果输入是12345,我希望结果是1*2*3*4*5=120。 我写了以下内容: import Data.Char stringProduct :: Int -> [Char] -> Int stringProduct p [] = p stringProduct p (n:ns) = stringProduct np ns where np = p * (digitToInt n) main = print $ stringProduct

例如,如果输入是12345,我希望结果是1*2*3*4*5=120。 我写了以下内容:

import Data.Char    

stringProduct :: Int -> [Char] -> Int
stringProduct p [] = p
stringProduct p (n:ns) = stringProduct np ns
        where np = p * (digitToInt n)

main =
    print $ stringProduct 1 "12345"
为什么在模式:stringProduct中得到8.hs:3:1:Parse错误? 更新:解决了第一个问题


但是如果结果是一个整数呢?

第一个问题是您需要在n:ns模式周围放上括号,否则Haskell将其解释为stringProduct p n:ns:

您可以通过读取[n]而不是将其转换为一个字符串来解决此问题:

stringProduct :: Integer -> [Char] -> Integer stringProduct p [] = p stringProduct p (n:ns) = stringProduct np ns where np = p * (read [n]) 要回答你的第二个问题,正如所指出的那样,Int至少是30位,范围是-229到229-1,但有一个固定的精度,例如64位。但是,整数具有任意精度:只要您的计算机有足够的可用内存,并且操作系统愿意共享,它就会使用该内存来存储整数的整个值。因此,整数没有理论上的最大值。事实当然是,如果您的机器有(包括交换空间),例如8 GiB的内存,最大值将类似于2233,这不是无限的,尽管它可以满足大多数实际应用

以两个简短版本的程序为例:

stringProductInteger :: String -> Integer
stringProductInteger = product . map (read . (:[]))

stringProductInt :: String -> Int
stringProductInt = product . map (read . (:[]))
现在如果我们做实验:

*Main> stringProductInt "123456789123456781234567213456723456712345678"
3092908213020917760
*Main> stringProductInteger "123456789123456781234567213456723456712345678"
75525861717854650368000000
Int在64位溢出,因此结果是带有整数但带有wraprounds的结果。例如:

*Main> (2^33) :: Int
8589934592
*Main> (2^64) :: Int
0
*Main> (2^64) :: Integer
18446744073709551616
*Main> (2^63) :: Integer
9223372036854775808
*Main> (2^63) :: Int
-9223372036854775808

第一个问题是您需要在n:ns模式周围放上括号,否则Haskell将其解释为stringProduct p n:ns:

您可以通过读取[n]而不是将其转换为一个字符串来解决此问题:

stringProduct :: Integer -> [Char] -> Integer stringProduct p [] = p stringProduct p (n:ns) = stringProduct np ns where np = p * (read [n]) 要回答你的第二个问题,正如所指出的那样,Int至少是30位,范围是-229到229-1,但有一个固定的精度,例如64位。但是,整数具有任意精度:只要您的计算机有足够的可用内存,并且操作系统愿意共享,它就会使用该内存来存储整数的整个值。因此,整数没有理论上的最大值。事实当然是,如果您的机器有(包括交换空间),例如8 GiB的内存,最大值将类似于2233,这不是无限的,尽管它可以满足大多数实际应用

以两个简短版本的程序为例:

stringProductInteger :: String -> Integer
stringProductInteger = product . map (read . (:[]))

stringProductInt :: String -> Int
stringProductInt = product . map (read . (:[]))
现在如果我们做实验:

*Main> stringProductInt "123456789123456781234567213456723456712345678"
3092908213020917760
*Main> stringProductInteger "123456789123456781234567213456723456712345678"
75525861717854650368000000
Int在64位溢出,因此结果是带有整数但带有wraprounds的结果。例如:

*Main> (2^33) :: Int
8589934592
*Main> (2^64) :: Int
0
*Main> (2^64) :: Integer
18446744073709551616
*Main> (2^63) :: Integer
9223372036854775808
*Main> (2^63) :: Int
-9223372036854775808

正如@epsilonhalbe提醒我的那样,这要好得多:

stringProduct = product . map digitToInt
您可以使用几个高阶函数来简化此过程:

stringProduct :: String -> Integer
stringProduct s = product $ map read (map (:[]) s)
分解它

> map (:[]) "123"
["1", "2", "3"]
> map read ["1", "2", "3"] :: [Integer]
[1,2,3]
> product [1,2,3]
6

正如@epsilonhalbe提醒我的那样,这要好得多:

stringProduct = product . map digitToInt
您可以使用几个高阶函数来简化此过程:

stringProduct :: String -> Integer
stringProduct s = product $ map read (map (:[]) s)
分解它

> map (:[]) "123"
["1", "2", "3"]
> map read ["1", "2", "3"] :: [Integer]
[1,2,3]
> product [1,2,3]
6

注意,read需要一个字符串,但您需要n,一个字符。另外,您需要n:n注意,read需要一个字符串,但您需要n,一个字符。另外,您需要n:NSR产品。map DigitPoint出于某种原因,我认为DigitPoint不是标准的Haskell,而是OP.IIRC编写的东西,它只是一个导入数据。Char DigitPoint Away虽然这是一个正确的答案,但取另一个+1,我认为出于教育目的,应该小心一次引入太多函数,尤其是更高阶的函数。您可以进一步将其简化为stringProduct=product。地图显示:[]同样:@WillemVanOnsem同意。我确实抵制了以无点风格定义stringProduct的冲动:或产品。map DigitPoint出于某种原因,我认为DigitPoint不是标准的Haskell,而是OP.IIRC编写的东西,它只是一个导入数据。Char DigitPoint Away虽然这是一个正确的答案,但取另一个+1,我认为出于教育目的,应该小心一次引入太多函数,尤其是更高阶的函数。您可以进一步将其简化为stringProduct=product。地图显示:[]同样:@WillemVanOnsem同意。我确实抵制了以无点风格定义stringProduct的冲动:实际上,int至少是32位No。在GHC的当前版本中,可能是这样,但Haskell语言只承诺29位:Haskell只保证Int至少覆盖范围[−229,229 − 1] 第6节。4@ThomasM.DuBuisson:如果它包含-2^29到2^29-1,我认为它至少包含30位。尽管如此,它还是被发现了;。实际上,int至少是32位No。在GHC的当前版本中,可能是这样,但Haskell语言只承诺29位:Haskell只保证Int至少覆盖范围[−229,229 − 1] 第6节。4@ThomasM.DuBuisson:如果它包含-2^29到2^29-1,我认为它至少包含30位。尽管如此,它还是被发现了;。