我正在尝试使用类型为[(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
答案 0 :(得分:4)
tupToStr = concatMap (\(c,i) -> c:show i)
答案 1 :(得分:2)
我们可以使用Data.Char
中的intToDigit :: Int -> 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'
将使用show
获取大于9的值时,才能执行此操作)。如果您想要处理范围之外的值,可以使用String
,但这当然会返回Prelude Data.Char> tupToStr [('j',9),('x',1),('f',3)]
"j9x1f3"
。通过上面的代码,我们得到:
import { makeExecutableSchema, addMockFunctionsToSchema } from 'graphql-tools';
//import mocks from './mocks';
import { resolvers } from "./resolvers";
const typeDefs = `
type Author {
id: Int
firstName: String
lastName: String
posts: [Post]
}
type Post {
id: Int
title: String
text: String
views: Int
author: Author
}
type Query {
getAuthor(firstName: String, lastName: String): Author
allAuthors: [Author]
}
`;
const schema = makeExecutableSchema({ typeDefs, resolvers });
// addMockFunctionsToSchema({ schema, mocks, preserveResolvers: true});
export default schema;
答案 2 :(得分:1)
将底线更改为:
tupToStr ((a,b):xs) = a : show b ++ tupToStr xs