[Haskell-cafe] begginers' questions

Daniel Fischer daniel.is.fischer at web.de
Fri Jan 29 16:57:14 EST 2010


Am Freitag 29 Januar 2010 22:38:11 schrieb Han Joosten:
> knyttr wrote:
<snip>
> fun x [] [] = ...
> fun x y  [] = ...
> fun x y z = ...
> would make more sence.
>
> however, there still is overlap.  (ghc could generate a warning for
> this)
>
> now the where part: there are several options:
>
> fun x y z
>
>     | z == [] = ...
>     | y == [] = ...
>     | otherwise = ...
>
>   where
>     ...


Better use 

fun x y z
    | null z    = ...
    | null y    = ...
    | otherwise = ....
      where
        ....

>
> or using a case expression...
>
> fun x y z = case (x,y,z) of
>                    (_ , _     , [])     -> ...
>                    (_ , []    , [_:_]) -> ...
>                    (_ , [_:_], [_:_]) -> ...
>    where
>       ...
> pattern matches do not overlap this way. you could use this pattern
> matches also in the previous solution.
>
> Then your second question:
> > 2. how can I change a field in a list in the most easy way? the only
> > solution I found is below. I am not very happy with it - it does too
> > many operations just to change one field.
> >
> > changeIn array index value = (take (index-1) array)++[value]++(drop
> > index array)
>
> Remember, in haskell you do not 'change' values in variables. Thers is
> no such thing as a variable. You probably want a function that takes a
> list, an index and a value. It produces a list with all elements from
> the first list, only the n-th element is replaced with the given value.
> I would specify this as follows:
>
> f x:xs i v
>
>    | i == 1 = v:xs
>    | i > 1  = x : (f xs (i-1) v)
>
> but there are probably dozens of other ways to do this. While you are
> new to Haskell, do not worry too much about performance.

True, but also

*** be aware that lists are NOT arrays ***

trying to use them as such is sure to land you in a deep hole of horrible 
performance sooner or later.

If what you need is an array, use arrays (immutable or mutable, depending 
on the problem at hand). If you need a set, use sets (Data.Set e.g.), if a 
list is appropriate for what you want to do, use the versatile [].

> (ghc will surly
> surprise you =^D) The main thing is to think functions. If you do that,
> you will appreciate Haskell for sure.



More information about the Haskell-Cafe mailing list