将类型(Char,Int)的元组列表转换为Haskell中的字符串

时间:2018-04-12 16:44:47

标签: string haskell tuples

我正在尝试使用类型为[(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 

3 个答案:

答案 0 :(得分:4)

tupToStr = concatMap (\(c,i) -> c:show i)

答案 1 :(得分:2)

我们可以使用Data.Char中的intToDigit :: Int -> Char函数。此外,在元组中使用模式匹配而不是使用fstsnd更为优雅。所以我们可以将其重写为:

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