On Dec 6, 2009, at 4:42 AM, MeAdAstra wrote:
I only started learning Haskell some days ago. Maybe one of you can give me a hint on how to implement a function that needs a character in the range (a,b,...z) and an integer number k and returns the k-next neighbor of the
character? For example, fct a 5 would result in output f.

I'm reading between the lines here.  I think you want

alphabetic_successor :: Int -> Char -> Char
{-
   alphabetic_successor k c
   requires k >= 0 and c `elem` lower_case_letters
   ensures result `elem` lower_case_letters
   where lower_case_letters = "abcdefghijklmnopqrstuvwxyz"
-}

What's not clear from your description is what's supposed to
happen if you ask for alphabetic_successor 5 'z'.  I'll
assume you want to think of the letters being in a circle.

It is possible to hack this using character->integer
and integer->character conversion, but I'm going to do it
another way that doesn't depend on the characters being
contiguous in the Unicode character set.  You could use the
code to find the successor in a sequence of consonants, for
example.

A.  We want to find the position of c in lower_case_letters.
    The first thing to do is to read the documentation and see
    if there is a suitable function.  There's one in the List
    module: elemIndex :: Eq x => x -> [x] -> Maybe Int.
    This will work for any type x (including characters) that
    supports equality (==).  It takes an item, a list of items,
    and either returns Nothing (the item wasn't found) or
    (Just n) -- the item was found at position n, 0 offset.

B.  We add k to n and reduce it modulo the length of the list.

C.  Given our new position, we want to find the character at
    that position in the list.  The function for that is
    list !! index.

import List (elemIndex)

alphabetic_successor k c = lower_case_letters !! new_index
  where Just index = List.elemIndex c lower_case_letters
        new_index = (k + index) `mod` length lower_case_letters
        lower_case_letters = "abcdefghijklmnopqrstuvwxyz"


_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to