gpt4 book ai didi

haskell - 如何根据列表的后半部分简洁地匹配列表,并相应地绑定(bind)它的前半部分?

转载 作者:行者123 更新时间:2023-12-02 18:34:26 24 4
gpt4 key购买 nike

假设我有一个函数 f::String -> String 并且想要匹配以下形式的参数

_ ++ "bar"

其中 _ 是我想要返回的未指定字符串。换句话说,我想匹配像 foobarbazbar 这样的参数,并分别返回 foobaz 。 p>

使用ViewPatterns可以实现如下:

{-# LANGUAGE ViewPatterns #-}

f :: String -> String
f x@(reverse . take 3 $ reverse -> "bar") = take (n-3) x
where n = length x

...但这远非理想。主要是因为如果我决定组合两个或多个这样的模式,事情很快就会变得棘手。

理想情况下,我希望能够编写如下内容:

f (x:"bar") = x

但不幸的是,这不是有效的 Haskell。

ViewPatterns 或其他扩展中是否有适当的解决方案?

最佳答案

在内置String 上,这是一个非常糟糕的主意,因为您的模式匹配结果非常昂贵。在其他字符串类型上,例如 TextByteString,您可以使用模式保护:

{-# LANGUAGE OverloadedStrings #-}

import qualified Data.Text as T

f :: Text -> Text
f x | Just x' <- T.stripSuffix "bar" x = ...

或者使用ViewPatterns(我不太喜欢):

{-# LANGUAGE OverloadedStrings, ViewPatterns #-}

import qualified Data.Text as T

f :: Text -> Text
f (T.stripSuffix "bar" -> Just x') = ...

关于haskell - 如何根据列表的后半部分简洁地匹配列表,并相应地绑定(bind)它的前半部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56191326/

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