将表示二进制数的字符串转换为基数10字符串haskell

Joh*_*son 11 haskell

我有字符串"1001",我想要字符串"9".

数字库有(相当笨重)showIntAtBase,但我无法找到相反的结果.

ACo*_*lie 13

这或多或少是您从Prelude中寻找的内容.从数字:

(注意:readInt是showIntAtBase的"双重",readDec是showInt的"双重".不一致的命名是历史事故.)

import Data.Char  (digitToInt)
import Data.Maybe (listToMaybe)
import Numeric    (readInt)

readBin :: Integral a => String -> Maybe a
readBin = fmap fst . listToMaybe . readInt 2 (`elem` "01") digitToInt
-- readBin "1001" == Just 9
Run Code Online (Sandbox Code Playgroud)


ice*_*man 10

从原始帖子开始已经有一段时间了,但为了将来读者的利益,我会使用以下内容:

import Data.Char (digitToInt)
import Data.List (foldl')

toDec :: String -> Int
toDec = foldl' (\acc x -> acc * 2 + digitToInt x) 0
Run Code Online (Sandbox Code Playgroud)

无需使用慢下来^,reverse,zipWith,length,等.

此外,使用严格的折叠可以减少内存需求.