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 在Haskell中将类型为(Char,Int)的元组列表转换为字符串_String_Haskell_Tuples - Fatal编程技术网

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)