これは、いくつかの追加の入力を伴うハックなソリューションですが、バッククォートはありません! よろしければ、最初にこれをredditに投稿しました。
Enum
から派生したと仮定しますRank
。
data OF = OF
ace :: OF -> Suit -> PokerCard
ace _ s = PokerCard Ace s
-- or point-free
two :: OF -> Suit -> PokerCard
two _ = PokerCard Two
-- or with const
three :: OF -> Suit -> PokerCard
three = const (PokerCard Three)
-- you get the idea!
-- the rest in one line:
four,five,six,seven,eight,nine,ten,jack,king :: OF -> Suit -> PokerCard
[four,five,six,seven,eight,nine,ten,jack,king] = map (const . PokerCard) [Four .. King]
-- now you can write
pokerDeck = [
ace OF Spades, two OF Spades -- and so on
]
OF データ型は厳密には必要ではありませんが、ace "Motorhead" Spades
. あなたはまだ書くことができますace undefined Spades
、本当にそれを回避する方法はないと思います。
of
キーワードでない場合は、 と書くこともできますof = OF
。
「の」を完全に取り除き、カードに数字を使用する、まったく邪悪なハックもあります。
{-# LANGUAGE FlexibleInstances #-} -- this goes on top of your file
instance Num (Rank -> Suit) where
fromInteger n = (undefined : map Card[Ace .. King]) !! (fromInteger n)
型チェックが行われるようになりまし2 Spades :: Card
た (ただし、明示的な型が必要です!) と思われるものです :-) ただし、深刻なコードではこれを行わないことを強くお勧めします。しかし、それはちょっとクールに見えます。