haskell で qwerty 距離関数を実装しようとしています。この一環として、定義された構造 (ベクトル、リスト、配列?) 内の特定の要素の i,j インデックスを返す関数が必要であると思いつきました。そして、私は立ち往生しています。
import qualified Data.Vector as V
qwerty = V.fromList $ map V.fromList
[ "qwertyuiop", "asdfghjkl;'", "zxcvbnm,./" ]
次のようなものを試すことができます:
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
これは、インデックスをリスト要素に関連付けるタスクです。通常、これは で簡単に実行できます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