首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表的第一个和最后一个项目上的模式匹配

列表的第一个和最后一个项目上的模式匹配
EN

Stack Overflow用户
提问于 2015-02-16 12:38:40
回答 6查看 1.1K关注 0票数 3

是否可以对“以f开头”、“任意文本”和“以b结尾”进行模式匹配

我试过了:

代码语言:javascript
复制
f :: String -> Bool
f ('f':xs:'b') = True
f _            = False

但是我得到了一个错误:

代码语言:javascript
复制
explore/PatternMatching.hs:2:11:
    Couldn't match expected type ‘[Char]’ with actual type ‘Char’
    In the pattern: 'b'
    In the pattern: xs : 'b'
    In the pattern: 'f' : xs : 'b'
Failed, modules loaded: none.
EN

回答 6

Stack Overflow用户

发布于 2015-02-16 12:55:56

在没有模式匹配语言扩展的情况下,没有简单的方法可以做到这一点。我会把它写成:

代码语言:javascript
复制
f :: String -> Bool
f str = case (take 1 str, drop (length str - 1) str) of
    ("f", "b") -> True
    otherwise -> False

(使用takedrop避免特殊处理在使用head!!时可能导致错误的空字符串的情况)

代码语言:javascript
复制
Prelude> f "flub"
True
Prelude> f "foo"
False
Prelude> f "fb"
True
Prelude> f "fbbbb"
True
Prelude> f "fbbbbf"
False
Prelude> f ""
False
票数 7
EN

Stack Overflow用户

发布于 2015-02-16 14:13:49

正如前面的答案所述,没有办法直接对此进行模式匹配。可以按如下方式实现它:

代码语言:javascript
复制
f 'f':xs@(_:_) = last xs == 'b'  -- @(_:_) ensures nonempty tail
f _            = False
票数 2
EN

Stack Overflow用户

发布于 2015-02-16 13:24:46

不,这不是直接可能的。

:希望左侧有一个列表元素,右侧有一个列表。

'f':xs:'b'无效,因为在第二个:的右侧有一些不是列表的内容。

'f':xs:"b"是有效的,但不会做您想做的事情,因为xs被推断为列表元素,而不是列表。

我会这样做:

代码语言:javascript
复制
f s = f' (s, reverse s) where
   f' ('f':_, 'b':_) = True
   f' _              = False

测试:

代码语言:javascript
复制
*Main> f ""
False
*Main> f "f"
False
*Main> f "b"
False
*Main> f "fb"
True
*Main> f "feeeeeeeb"
True
*Main> f (repeat 'b')
False
*Main> f (repeat 'f')
(hangs indefinitely)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28534612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档