gpt4 book ai didi

haskell - Haskell中的模式匹配字符串前缀

转载 作者:行者123 更新时间:2023-12-03 10:09:23 24 4
gpt4 key购买 nike

假设我想为匹配以字符“Z”开头的字符串的函数创建一个特殊情况。我可以通过执行以下操作轻松地使用模式匹配来做到这一点:

myfunc ('Z' : restOfString) = -- do something special
myfunc s = -- do the default case here

但是如果我想匹配带有更长前缀的字符串呢?假设我想对以单词“toaster”开头的字符串有一个特殊的情况。编写模式以匹配这样的字符串的最佳方法是什么?

最佳答案

myfunc ('t':'o':'a':'s':'t':'e':'r' : restOfString) = ...

使用正常的模式匹配是可行的,但随着前缀字符串变长会变得很麻烦。
{-# LANGUAGE PatternGuards #-}
import Data.List
myFunc string | Just restOfString <- stripPrefix "toaster" string =
-- do something special
myFunc string = -- do the default case here

使用库函数而不是模式匹配更容易读写。
{-# LANGUAGE ViewPatterns #-}
import Data.List
myFunc (stripPrefix "toaster" -> Just restOfString) = -- do something special
myFunc string = -- do the default case here

GHC 6.10 语法扩展使这种用法更加自然。

当然,后两者是完全等价的,我们可以(乱七八糟地)不加任何糖。
import Data.List
myFunc string =
if restIsJust
then -- do something special
else -- do the default case here
where
(restIsJust, restOfString) =
case stripPrefix "toaster" string of
Just something -> (True, something)
Nothing -> (False, undefined)

不过,这些语法扩展旨在让我们的生活更轻松。

关于haskell - Haskell中的模式匹配字符串前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1602243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com