3

関数を infix として定義して、ユーザーが関数を手動でバッククォートで囲む必要がないようにしたいと思います。具体的には、ランクとスーツを受け取り、ポーカー カード レコードを構築する DSL のような関数を作成しています。

-- pseudocode
data PokerCard = PokerCard { rank :: Rank, suit :: Suit } deriving (Eq)

of :: Rank -> Suit -> PokerCard
r of s = PokerCard { rank = r, suit = s }

pokerDeck = [
  Ace of Spades,
  Two of Spades,
  ...
  ]

ofは式の構文として予約されていると思うcase ... ofのでof'.of+of、 などの名前に変更する必要があります。

4

3 に答える 3

10

英数字の名前を infix として関数を定義する方法はありません。Haskell の構文規則では、シンボリック名またはバッククォートで囲まれた関数名を持つ関数のみを infix として使用できます。これを変更する方法はありません。

于 2013-03-11T19:41:10.063 に答える
6

これは、いくつかの追加の入力を伴うハックなソリューションですが、バッククォートはありません! よろしければ、最初にこれを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た (ただし、明示的な型が必要です!) と思われるものです :-) ただし、深刻なコードではこれを行わないことを強くお勧めします。しかし、それはちょっとクールに見えます。

于 2013-03-11T21:27:37.113 に答える
6

さて、あなたはすでにこれを知っているかもしれませんが、(もちろん) 演算子は /can/ 中置にすることができます。そのため、代わりr of sr >| s.

于 2013-03-11T20:03:22.270 に答える