簡體   English   中英

Haskell字符串列表到Int列表

[英]Haskell String list to Int list

我有一個字符串列表,我想逐一讀取字符串並將其轉換為整數列表,有沒有辦法將每個字符轉換為新列表?

["123","346","789"] to [[1,2,3],[4,5,6],[7,8,9]]

stringToInt :: [String] -> [[Int]]

函數式編程的支柱之一是map ,它具有以下特征:

map :: (a -> b) -> [a] -> [b]

換句話說,它接受一個期望值為a類型的值並返回類型b的值的函數(注意,這些值可以是同一類型,但不一定是),並帶有a值列表,然后踢您返回b值的列表。 舉個例子:

double :: Int -> Int
double = (*2)
{- equivalently written as:
   double x = x * 2 -}

as = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
bs = map double as

在此示例中,map專用於a ~ Intb ~ Int ,解析為

map :: (Int -> Int) -> [Int] -> [Int]

然后bs[2, 4, 6, 8, 10, 12, 14, 16, 18, 20] bs [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]


為什么在map上這么長的底漆? 因為它是函數式編程中包括答案在內的許多答案的框架。 請記住, String只是[Char]的類型同義詞,因此您嘗試從[[Char]] -> [[Int]]轉到。 e,肯定看起來像map的類型簽名的最后兩個詞,不是嗎? 讓我們專門針對這些術語進行操作的map

map :: ([Char] -> [Int]) -> [[Char]] -> [[Int]]

但是等等, map期望的功能看起來像映射的結果。 讓我們也這樣寫。

map :: (Char -> Int) -> [Char] -> [Int]

因此,我們想要的是一個雙重映射,它應用於某些函數f ,使得:

map (map f) :: [[Char]] -> [[Int]]
{- more idiomatically written as
   (map . map) f :: [[Char]] -> [[Int]] -}

這意味着我們需要一個f :: Char -> Int -一些從單個字符到整數的函數。 該操作的定義輸入的數量相當少,所以我只寫它。

digitToInt :: Char -> Int
digitToInt '0' = 0
digitToInt '1' = 1
digitToInt '2' = 2
digitToInt '3' = 3
digitToInt '4' = 4
digitToInt '5' = 5
digitToInt '6' = 6
digitToInt '7' = 7
digitToInt '8' = 8
digitToInt '9' = 9
digitToInt 'a' = 10
digitToInt 'A' = 10
digitToInt 'b' = 11
digitToInt 'B' = 11
digitToInt 'c' = 12
digitToInt 'C' = 12
digitToInt 'd' = 13
digitToInt 'D' = 13
digitToInt 'e' = 14
digitToInt 'E' = 14
digitToInt 'f' = 15
digitToInt 'F' = 15
digitToInt _   = error "Invalid digit"

但是請注意,此功能是Data.Char標准Data.Char

import Data.Char (digitToInt)

那么您的結果是:

result = (map.map) digitToInt ["123","346","789"]
import Data.List (intersperse)

f :: String :: [Int]
f stringnum = read $ "[" ++ intersperse  ',' stringnum ++ "]" :: [Int]

>>> map f ["123", "456"]
[[1,2,3],[4,5,6]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM