【发布时间】:2021-03-01 20:10:38
【问题描述】:
我制作了一个元组列表:
dic = zip(['a' .. 'z') (['o' .. ])
它也应该适用于无限列表,所以我想我不能使用递归或列表理解。然后呢? :D 结果应该是这样的:
dic :: [Char] -> [Char]
dic "abc" = "opq"
【问题讨论】:
标签: dictionary haskell tuples encode translate
我制作了一个元组列表:
dic = zip(['a' .. 'z') (['o' .. ])
它也应该适用于无限列表,所以我想我不能使用递归或列表理解。然后呢? :D 结果应该是这样的:
dic :: [Char] -> [Char]
dic "abc" = "opq"
【问题讨论】:
标签: dictionary haskell tuples encode translate
首先,你应该从'z' 回绕到'a',所以你的dic 看起来像:
dic :: [(Char, Char)]
dic = zip ['a'..'z'] (['o'..'z'] ++ ['a'..])
现在,您可以从列表中查找字符:
func :: [Char] -> [Char]
func = map (\x ->
case lookup x dic of
Just v -> v
otherwise -> x)
或者,使用来自Data.Maybe 的fromMaybe:
import Data.Maybe
func :: [Char] -> [Char]
func = map (\x -> fromMaybe x $ lookup x dic)
由于惰性求值,这适用于无限字符列表(以及递归/列表理解解决方案):如果不使用值,则不计算它。
【讨论】: