Data.Map
ルックアップをより高速に実行するために使用する、ヨアヒムの回答のわずかに強化されたバージョン。TupleSections プラグマも使用します。
{-# LANGUAGE TupleSections #-}
import Data.Map
import Control.Monad
きちんとしたものにするために、あなたのPiece
型が与えられると仮定してくださいOrd
、Bounded
およびEnum
インスタンス。
data Piece = Knight | Bishop | Rook deriving (Ord,Bounded,Enum,Show)
enumerate
便利な関数を定義する
enumerate :: (Bounded a, Enum a) => [a]
enumerate = [minBound..maxBound]
今、あなたはすることができます
convert :: (Monad m, Bounded a, Enum a, Ord a) => (a -> m b) -> m (a -> b)
convert f = do
memo <- sequence [liftM (a,) (f a) | a <- enumerate]
return (fromList memo!)