问题
I have a question on pattern matching:
Is it possible to somehow match a (string ++ [char] ++ anotherstring)?
I have tried something like:
f (s++";"++r) = s++r (the rhs is trivial, but its just for testing ;))
But this results in a parse error.
回答1:
No, it's not possible. Pattern matching deconstructs values according to the constructors they were built with, so you can only use constructor applications in pattern matching to describe which values match the pattern and which don't.
For something like your example, a case
works well,
f str = case break (== ';') str of
(s, _:r) -> s ++ r
_ -> error "No semicolon found"
回答2:
For completeness' sake, one could make gratuitous use of GHC's ViewPatterns
extension, and rewrite Daniel Fischer's example as something like:
{-# LANGUAGE ViewPatterns #-}
f (break (== ';') -> (s, _:r)) = s ++ r
f _ = error "No semicolon found"
This is of course a purely cosmetic change, but if you prefer the usual "group of equations" syntax instead of case
expressions, there it is.
N.B. -- I don't have GHC at hand right now so I haven't actually tested the above.
回答3:
No it is not possible. There are many functions in split which you can use to accomplish what you are trying to do.
回答4:
You can do this kind of pattern matching similar to the way proposed here:
Haskell pattern matching conundrum
来源:https://stackoverflow.com/questions/64944929/pattern-match-with-strings-in-haskell