如果其中一个元素产生Nothing,则使map返回Nothing



我正试图在Haskell中实现霍夫曼压缩以用于学习目的。到目前为止,我可以成功地为给定字符串创建正确的树,并且可以从特定树中获得到字符的正确路径。该函数的签名如下:

getPath :: HuffmanTree -> Char -> Maybe String

返回一个Just String,其中'0'表示左分支,'1'表示右分支。如果字符不包含在树中,则返回none。我的下一步是传递给它一个完整的字符串,并将其转换为一个由1和0组成的编码字符串。如果在树中没有找到其中一个字符,该方法应该返回Nothing,因此函数签名应该如下所示:

encode :: HuffmanTree -> String -> Maybe String

我当前的方法是这样做的:

encode tree str =
let encodings = map (e -> getPath tree e) str
in
if elem Nothing encodings
then Nothing
else
let encodings' = map fromJust encodings
in Just (foldl (++) "" encodings')

但这似乎不是一个很好的解决方法。我知道,如果第一个getPath返回Nothing,我可以中止一切,所以之后的每个求值都是不必要的。我觉得,有一种奇特的单元化方法可以做到这一点,但我想不出一个,我真的不知道该找什么。或者这是正确的方式,让懒惰来照顾一切?

确实有一种单元化的方法可以做到这一点,而且并不特别花哨。这正是Maybe应用程序的,因此您可以使用traverse:

encode tree str = fmap concat $ traverse (e -> getPath tree e) str

或短

encode tree = fmap concat . traverse (getPath tree)

整洁的,是吗?

相关内容

最新更新