У меня есть следующий код, который должен преобразовать тип столбца excel в соответствующий номер. Например, AA в 27 и AB в 28:
import Data.Char (ord)
import Data.List (foldl1')
columnToNumber :: String -> Int
columnToNumber s = foldl1' (\acc (i, v) -> acc + 26 ^ i * v) (values s)
where values s = zip (reverse [0..(length s)]) ((\c -> ord c - 64) <$> s)
Идея состоит в том, чтобы взять строку «AA» и преобразовать ее в соответствующие числа.
["A", "A"] -> [1, 1]
и скрепите его с основанием справа налево 26^0, 26^1, 26^2 и так далее.
zip [1, 0] [1, 1] -> [(1, 1), (0, 1)]
Таким образом, результат сгиба будет
26^1 * 1 + 26^0 * 1 = 27
К сожалению, я получаю следующие ошибки, и я не уверен, почему:
ExcelSheetColumn.hs:7:34:
Couldn't match expected type ‘Int’
with actual type ‘(Integer, Int)’
In the pattern: (i, v)
In the first argument of ‘foldl1'’, namely
‘(\ acc (i, v) -> acc + 26 ^ i * v)’
In the expression:
foldl1' (\ acc (i, v) -> acc + 26 ^ i * v) (values s)
ExcelSheetColumn.hs:7:63:
Couldn't match type ‘(Int, Int)’ with ‘Int’
Expected type: [Int]
Actual type: [(Int, Int)]
In the second argument of ‘foldl1'’, namely ‘(values s)’
In the expression:
foldl1' (\ acc (i, v) -> acc + 26 ^ i * v) (values s)
Может ли кто-нибудь помочь мне?
length s - 1
в своей функции значений. - person Free_D   schedule 11.05.2016