String 在Haskell中将类型为(Char,Int)的元组列表转换为字符串
我试图获取一个元组列表,类型为String 在Haskell中将类型为(Char,Int)的元组列表转换为字符串,string,haskell,tuples,String,Haskell,Tuples,我试图获取一个元组列表,类型为[(Char,Int)],并将其转换为字符串。 例如: tupToStr [('j',9),('x',1),('f',3)] "j9x1f3" 我的尝试如下。我的问题是cons运算符要求所有值都具有相同的类型。所以我不能做'j':例如9:[]。因此,您将看到一个占位符函数,intToChar,它理想地将Int转换为Char。是否有一种简单的转换方法,可以简单地适合我现有的函数?如果不是,您将如何编写函数来进行相关转换 tupToStr :: [(Char, Int
[(Char,Int)]
,并将其转换为字符串。
例如:
tupToStr [('j',9),('x',1),('f',3)]
"j9x1f3"
我的尝试如下。我的问题是cons运算符要求所有值都具有相同的类型。所以我不能做'j':例如9:[]
。因此,您将看到一个占位符函数,intToChar
,它理想地将Int
转换为Char
。是否有一种简单的转换方法,可以简单地适合我现有的函数?如果不是,您将如何编写函数来进行相关转换
tupToStr :: [(Char, Int)] -> String
tupToStr [] = []
tupToStr (x:xs) = (fst x) : intToChar(snd x) : tupToStr xs
我们可以使用Data.Char
中的函数来实现这一点。此外,在元组中使用模式匹配比使用fst
和snd
更优雅。因此,我们可以将其改写为:
import Data.Char(intToDigit)
tupToStr :: [(Char, Int)] -> String
tupToStr [] = []
tupToStr ((c, n):xs) = c : intToDigit n : tupToStr xs
请注意,如果n
始终在0..15
范围内(intToDigit
将使用'a'..'f'
来表示大于9的值),则此操作将仅起作用。如果要处理范围之外的值,可以使用show
,但这当然会返回字符串。通过上述代码,我们得到:
Prelude Data.Char> tupToStr [('j',9),('x',1),('f',3)]
"j9x1f3"
将底线更改为:
tupToStr ((a,b):xs) = a : show b ++ tupToStr xs
如果数字小于零,或大于9,该怎么办?您可以使用show
将Int转换为字符串(实际上是任何可显示的类型)@WillemVanOnsem假设数字在0到9的闭合区间内。@Euge使用show(snd x)
做了这个特技,使用a:show b++tupToStr xs
会更有效。
tupToStr = concatMap (\(c,i) -> c:show i)