【问题标题】:Basic encryption using higher order functions in Haskell在 Haskell 中使用高阶函数进行基本加密
【发布时间】:2017-10-25 23:41:01
【问题描述】:

我正在处理一个与基本加密相关的问题。我正在尝试创建一个名为encryptf 的函数

  1. 获取 a 的 xs 列表
  2. 获取 a 的列表 ys
  3. 返回一个函数,该函数将 xs 的元素映射到 ys 的相应元素,并将其他所有元素映射到自身。

到目前为止,它看起来像这样:

encryptf :: Eq a => [a] -> [a] -> (a -> a)
encryptf xs ys = \f -> head [d | (c,d) <- (zip xs ys)]

还有一个名为encryptString 的函数,如下所示:

encryptString :: (a -> a) -> [a] -> [a]
encryptString f xs = map f xs

这些函数将像这样使用:

encryptString (encryptf "abc" "xyz") "dcba"

这将返回"dzyx"

现在我知道我的encryptf 函数是错误的,因为它会将所有内容更改为 ys 的第一个元素。我不知道从这里去哪里。任何帮助将不胜感激。

【问题讨论】:

  • 您需要查看您的关联列表zip xs ys 并找到键(元组的第一个元素)等于f 的第一个元素并返回值(元组的第二个元素)。使用Map 将使其在概念上更容易并且在操作上更快。
  • 查看lookup函数。
  • 您应该考虑为此作业使用地图数据类型。看看Data.Map

标签: haskell


【解决方案1】:

这个想法是你在压缩列表中搜索给定的字符,如果它存在则返回第二对,如果没有则返回字符本身。

encryptf :: Eq a => [a] -> [a] -> (a -> a)
encryptf xs ys = 
   let ret = zip xs ys in
   \f -> 
      case lookup f ret of
       Just c -> c
       Nothing -> f

encryptString :: (a -> a) -> [a] -> [a]
encryptString f xs = map f xs

*Main> encryptString (encryptf "abc" "xyz") "dcba"
"dzyx"

【讨论】:

    猜你喜欢
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    相关资源
    最近更新 更多