2013-09-20 9 views
0

Попытка реализовать функцию расстояния qwerty в haskell. Как часть этого, я придумал необходимость в функции, которая вернет индекс i, j определенного элемента в определенной структуре (вектор, список, массив?). И я застрял.Haskell find 2d index for qwerty distance

import qualified Data.Vector as V 
qwerty = V.fromList $ map V.fromList 
     [ "qwertyuiop", "asdfghjkl;'", "zxcvbnm,./" ] 

ответ

0

Это задача связывания индекса с элементами списка. Обычно это легко сделать с zip [0..] xs. Итак, сначала свяжите индекс с каждой строкой, затем сопоставьте индекс с каждым символом в строке.

import qualified Data.Map as M 
qwmap = M.fromList $ concatMap f $ zip [0..] qwerty where 
    qwerty = ["qwertyuiop[]", "asddfghjkl;'#", "zxcvbnm,./"] 
    f (i,cs) = map (\(j,c) -> (c, (i,j))) $ zip [0..] cs 

В качестве альтернативы, если вы не заботитесь о повторяющихся линейной стоимости elemIndex поиска:

import Data.List 
qp a = foldr f Nothing $ zip [0..] qwerty where 
    qwerty = ["qwertyuiop[]", "asddfghjkl;'#", "zxcvbnm,./"] 
    f (p,xs) n = maybe n (Just . (p,)) $ elemIndex a xs 
0

Вы можете попробовать что-то вроде:

import qualified Data.Vector as V 

qwerty = V.fromList $ map V.fromList 
     [ "qwertyuiop", "asdfghjkl;'", "zxcvbnm,./" ] 

findElement :: Char -> Maybe (Int,Int) 
findElement c = f $ V.findIndex (V.elem c) qwerty where 
    f (Just i) = (,) i `fmap` (V.elemIndex c $ qwerty V.! i) 
    f Nothing = Nothing