haskell - Haskell中有一个空字符吗?
问题描述
这是我的代码:
reverseEncode :: Char -> String -> Int -> Char
reverseEncode _ [] _ = ?
reverseEncode c (x:xs) offset
| alphaPos c == (alphaPos x + offset) `mod` 26 = chr (((alphaPos x + offset) + 65) `mod` 26)
| otherwise = reverseEncode c xs offset
这只是虚拟 Enigma Machine 中使用的一种小方法。在没有第二行的情况下编写函数并对其进行测试后,我得到了这个异常:
Non-exhaustive patterns in function reverseEncode
然后我意识到我没有告诉函数何时停止递归。这就是第二行代码的诞生方式。显然,我可以在每一步检查字符串的长度,但它看起来并不那么优雅。
在 Haskell 中有什么可以代替“吗?” ? 如果没有,有什么我可以定义的吗?或者这是可以以更好的方式完成的事情?
编辑:我实际上已经尝试过检查字符串长度的版本,但我得到了同样的异常。那么我该如何让它工作呢?
解决方案
没有空字符。但是,您可以使用Nul 字符[wiki]之类的字符。例如:
reverseEncode :: Char -> String -> Int -> Char
reverseEncode _ [] _ = '\00'
reverseEncode c (x:xs) offset
| alphaPos c == sm `mod` 26 = chr ((sm + 65) `mod` 26)
| otherwise = reverseEncode c xs offset
where sm = alphaPos x + offset
但更Haskellish的方法是更改返回类型。例如,使用 aMaybe Char
代替。这通常用于“可能失败的计算”。所以我们可以这样做:
reverseEncode :: Char -> String -> Int -> Maybe Char
reverseEncode _ [] _ = Nothing
reverseEncode c (x:xs) offset
| alphaPos c == sm `mod` 26 = Just (chr ((sm + 65) `mod` 26))
| otherwise = reverseEncode c xs offset
where sm = alphaPos x + offset
这里的Nothing
因此意味着我们在不满足条件的情况下到达了列表的末尾,并且Just x
意味着计算得到了一个答案x
。
推荐阅读
- javascript - 将 Tizen 可穿戴数据发送到服务器
- selenium - 尝试运行 selenium 脚本批处理文件时遇到 Jenkins 错误
- reactjs - UNMET PEER DEPENDENCY - 但我已经安装了它
- sql - 有没有办法将物化视图与模式中的常见视图区分开来
- python - sklearn中随机森林分类器的单树的OOB分数
- php - Openssl:创建 CSR string_mask 非法字符
- python - 提取bert的特征并将输出用作cnn或lstm的嵌入层
- php - 尝试将 Carbon 转换为 DateTime 时为什么会出错?
- python - 基于通用用户ID Python Pandas Numpy从另一个数据框中替换破折号值
- python - 如何获得神经网络中每个神经元的进出边缘权重?