首页 > 解决方案 > 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 中有什么可以代替“吗?” ? 如果没有,有什么我可以定义的吗?或者这是可以以更好的方式完成的事情?

编辑:我实际上已经尝试过检查字符串长度的版本,但我得到了同样的异常。那么我该如何让它工作呢?

标签: 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


推荐阅读