30

三項論理表を作成し、 を呼び出す演算子用に独自の関数を作成したいと考えています<=>

たとえば、私はこれをやりたいのですが、それは正しくありません。これを行う正しい方法は何ですか?

data Ternary = T | F | M
deriving (Eq,  Show, Ord)

<=> :: Ternary -> Ternary -> Ternary
<=> T F = F
<=> T T = T
<=> T M = M
<=> F F = T
<=> F T = F
<=> F M = M
<=> M F = M
<=> M T = M
<=> M M = T
4

4 に答える 4

49

演算子の周りに括弧を追加するだけです:

(<=>) :: Ternary -> Ternary -> Ternary
(<=>) T F = F
(<=>) T T = T
(<=>) T M = M
(<=>) F F = T
(<=>) F T = F
(<=>) F M = M
(<=>) M F = M
(<=>) M T = M
(<=>) M M = T

これにより、中置形から前置形に変わります。または、定義で infix を使用することもできます。

(<=>) :: Ternary -> Ternary -> Ternary
T <=> F = F
T <=> T = T
T <=> M = M
F <=> F = T
F <=> T = F
F <=> M = M
M <=> F = M
M <=> T = M
M <=> M = T
于 2012-02-20T05:10:22.243 に答える
12

記号を含む関数名は、記号を含まないものとは構文が異なります。

-- Works:
(<^>) :: Int -> Int -> Int
a <^> b = a + b

-- Doesn't work:
{-
<^> :: Int -> Int -> Int
<^> a b = a + b
-}

-- Works:
letters :: Int -> Int -> Int
letters a b = a + b

-- Doesn't work:
{-
(letters) :: Int -> Int -> Int
a letters b = a + b
-}

約束しますが、Haskell は複雑なルールを学ぶ価値があります。

于 2012-02-20T06:01:04.373 に答える
1

次のように定義を (行ごとに) 簡略化できます。

(<=>) :: Ternary -> Ternary -> Ternary
T <=> T = T
F <=> F = T
M <=> M = T
M <=> _ = M
_ <=> M = M
_ <=> _ = F
于 2012-02-20T18:33:28.697 に答える
0

EqとがあるのでOrd、次のことができます。

data Ternary = T | F | M
deriving (Eq, Show, Ord)

(<=>) :: Ternary -> Ternary -> Ternary
x <=> y = if x == y then T else max x y

たまたま変更した場合M <=> M == Mは、次のことができます。

data Ternary = M | T | F
deriving (Eq, Show, Ord, Enum)

(<=>) :: Ternary -> Ternary -> Ternary
x <=> y = fromEnum $ rem (toEnum x * toEnum y) 3
于 2012-02-24T02:36:59.017 に答える