las*_*igh 5 haskell functional-programming list-comprehension list
我刚刚开始使用Haskell并完成了一个很好的练习来制作一个Caesar密码.
最初的步骤之一是创建一个函数,它将接收一个字母并将其转换为数字.我知道chr和ord已经可以做到这一点但是练习的一部分是写自己的.
let2num c = head [ b | (a,b) <- zip ['a'..'z'] [0..25], a==c]
Run Code Online (Sandbox Code Playgroud)
我是Haskell语法的新手,我学到的第一件事就是列表理解,所以这已成为我的锤子.我很好奇,写这个函数的另一种(可能更好)方法是什么?
如果你很好奇,那么密码的其余部分就是一个要点.
编辑
我也对从数字翻译成字母的其他方式感兴趣.
num2let d = head [ a | (a,b) <- zip ['a'..'z'] [0..25], b==(d `mod` 26)]
Run Code Online (Sandbox Code Playgroud)
我的解决方案:
import Data.List
let2num c = let (Just n) = elemIndex c ['a'..'z'] in n
Run Code Online (Sandbox Code Playgroud)
或者:
import Data.List
import Data.Maybe
let2num c = fromJust $ elemIndex c ['a'..'z']
Run Code Online (Sandbox Code Playgroud)
或者以毫无意义的方式:
import Data.List
import Data.Maybe
let2num = fromJust . (flip elemIndex) ['a'..'z']
Run Code Online (Sandbox Code Playgroud)
该函数返回给定列表中与查询元素elemIndex相等(by )的第一个元素的索引,或者如果不存在这样的元素。==Nothing
该Maybe类型封装了一个可选值。type 的值Maybe a要么包含 type 的值a(表示为Just a),要么为空(表示为Nothing)。使用Maybe是处理错误或异常情况的好方法,无需采取错误等严厉措施。
该函数fromJust从 a 中提取元素Just。