是否可以对“以f开头”、“任意文本”和“以b结尾”进行模式匹配
我试过了:
f :: String -> Bool
f ('f':xs:'b') = True
f _ = False但是我得到了一个错误:
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.发布于 2015-02-16 12:55:56
在没有模式匹配语言扩展的情况下,没有简单的方法可以做到这一点。我会把它写成:
f :: String -> Bool
f str = case (take 1 str, drop (length str - 1) str) of
("f", "b") -> True
otherwise -> False(使用take和drop避免特殊处理在使用head或!!时可能导致错误的空字符串的情况)
Prelude> f "flub"
True
Prelude> f "foo"
False
Prelude> f "fb"
True
Prelude> f "fbbbb"
True
Prelude> f "fbbbbf"
False
Prelude> f ""
False发布于 2015-02-16 14:13:49
正如前面的答案所述,没有办法直接对此进行模式匹配。可以按如下方式实现它:
f 'f':xs@(_:_) = last xs == 'b' -- @(_:_) ensures nonempty tail
f _ = False发布于 2015-02-16 13:24:46
不,这不是直接可能的。
:希望左侧有一个列表元素,右侧有一个列表。
'f':xs:'b'无效,因为在第二个:的右侧有一些不是列表的内容。
'f':xs:"b"是有效的,但不会做您想做的事情,因为xs被推断为列表元素,而不是列表。
我会这样做:
f s = f' (s, reverse s) where
f' ('f':_, 'b':_) = True
f' _ = False测试:
*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)https://stackoverflow.com/questions/28534612
复制相似问题