Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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
Haskell中具有列表理解的数字字符映射_Haskell - Fatal编程技术网

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

我在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]
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'