Haskell中具有列表理解的数字字符映射
我在Haskell中有一个简单的函数,它接受如下元组列表:Haskell中具有列表理解的数字字符映射,haskell,Haskell,我在Haskell中有一个简单的函数,它接受如下元组列表:[(1,'a'),(2,'b')…(26,'z')],并根据输入的数字返回一个字母值。所以理想情况下 getCharByNum 3 > "c" 我尝试使用列表理解,过滤掉每个不包含该数字的元组 zippedChars = zip [ x | x <- [1..26]] [ x | x <- ['a'..'z']] getCharByNum :: (Integral a) => a -> [Char] ge
[(1,'a'),(2,'b')…(26,'z')]
,并根据输入的数字返回一个字母值。所以理想情况下
getCharByNum 3
> "c"
我尝试使用列表理解,过滤掉每个不包含该数字的元组
zippedChars = zip [ x | x <- [1..26]] [ x | x <- ['a'..'z']]
getCharByNum :: (Integral a) => a -> [Char]
getCharByNum num = [ head vector | vector <- zippedChars, num == last vector ]
如何正确构造允许此函数运行的类型签名?(我知道使用索引可以很容易地做到这一点,或者使用Data.Char.ord更容易做到这一点,但我正在努力更好地理解列表的含义)
编辑:我已经清理了一些代码:
zippedChars = zip [1..26] ['a'..'z']
getCharByNum :: Integral -> [Char]
getCharByNum num = [ c | (n,c) <- zippedChars, num == n ]
这是一个接受一个整数并返回字符列表的函数,因此我不确定我缺少了什么。您的问题是您使用的是
head
和last
,它们仅适用于列表,而vector
是元组。您需要使用fst
和snd
。甚至更好的是,您可以使用模式匹配:
getCharByNum num = [ c | (n,c) <- zippedChars, num == n ]
getCharByNum=[c |(n,c)你的问题是你使用的是head
和last
,它们只适用于列表,而你的vector
是一个元组。你需要使用fst
和snd
。或者更好的是,你可以使用模式匹配:
getCharByNum num = [ c | (n,c) <- zippedChars, num == n ]
getCharByNum=[c |(n,c)Integral是一个类型类。Integral不是一个类型。a是Integral的一个实例,所以我们在签名的开头声明它
zippedChars :: Integral a => [(a, Char)]
zippedChars = zip [1..26] ['a'..'z']
getCharByNum :: Integral a => a -> String
getCharByNum num = [ c | (n,c) <- zippedChars, num == n ]
>>> getCharByNum 3
'c'
Integral是一个类型类。Integral不是一个类型。a是Integral的一个实例,所以我们在签名的开头声明它
zippedChars :: Integral a => [(a, Char)]
zippedChars = zip [1..26] ['a'..'z']
getCharByNum :: Integral a => a -> String
getCharByNum num = [ c | (n,c) <- zippedChars, num == n ]
>>> getCharByNum 3
'c'
您尝试实现的函数是lookup
。您也可以将其(近似)实现为\i d->[(k,v)|(k,v)如果您在获取正确的类型签名时遇到问题,请尝试将其忽略,然后询问GHCi(在本例中,使用:t getCharByNum
)它推断出的类型是什么。顺便说一句,这是某种程度上的“标准”实现方法是使用fromnum/toEnum
将其转换为整数并返回,同时添加偏移量。无需构建查找表。您尝试实现的函数是lookup
。您还可以将其(近似)实现为\id->[(k,v)|(k,v)如果您在获取正确的类型签名时遇到困难,请尝试忽略它,然后询问GHCi(在本例中,使用:t getCharByNum
)它推断出的类型是什么。顺便说一句,这是一种“标准”实现这一点的方法是使用fromnum/toEnum
转换为整数并返回,同时添加偏移量。不需要构建查找表。是的,模式匹配和范围是一种更好的方法。不过,我仍在努力解决类型签名问题。是的,模式匹配和范围非常复杂这是一个更好的方法。不过我仍在努力解决类型签名的问题。
>>> ['a'..'z'] !! 4
'c'