Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using as-patterns not binding to the full List in Haskell

Ok, maybe the title is a little confusing, but what I am trying to do is have a function like this: f (a:b:c:d:is) = ... but be able to refer to a:b:c:d without writing it again. As it turns out, I can't do something like e@(a:b:c:d):is and get the expected result. Any ideas?

like image 234
byrondrossos Avatar asked Jan 03 '12 11:01

byrondrossos


2 Answers

The best I can think of is using view patterns, like this:

{-# LANGUAGE ViewPatterns #-}
f (splitAt 4 -> (as@[a,b,c,d], is)) = is ++ [d,c,b,a] ++ as
like image 184
Sjoerd Visscher Avatar answered Nov 06 '22 22:11

Sjoerd Visscher


You can't do that, one reason is that a:b:c:d is not a well-typed expression. By the binding in the definition of f, a, b, c, d all have the same type, say t, but the type of the list constructor is

(:) :: t -> [t] -> [t]

You can sort-of achieve what you want by binding let foo = take 4 inputList. Admittedly clunky, but I can't think of anything better off the top of my head.

like image 21
Daniel Fischer Avatar answered Nov 06 '22 22:11

Daniel Fischer