5

ブール値 (引数の 1 つ) に基づいて、さまざまな方法で 3 つの引数関数を適用したいと考えています。

チェーンできるように、中置式で適用できるようにしたいと思います(以下の例)。次のようなものですが、実際には機能します。

f :: Bool -> a -> a -> a

f True  i j = i
f False i j = j

... y `(f True)` z `(f False)` b

Bool を 2 番目の変数として持つ必要がありますか? または、他の何か?私はちょっと迷っています。

PS私がこれをやりたかった理由は、オプションの追加機能を持つことでした

4

5 に答える 5

7

2 つ以上の引数を持つ関数の中置記法は可能ですが、あまり良くありません。あなたの場合、与えられた

f :: Bool -> a -> a -> a
f True i j = i
f False i j = j

あなたは書ける

(True `f` 1) 3

(他の人が示唆しているように)書くのははるかに簡単です:

let ft = f True
let ff = f False

それからあなたはすることができます

1 `ft` 3 `ff` 5

使用したい場合は、次のfように記述してください。

(False `f` ((True `f` 1) 3)) 5

あなたはそれを確認することができます

1 `ft` 3 `ff` 5 == (False `f` ((True `f` 1) 3)) 5
于 2011-06-15T08:56:45.693 に答える
4

逆適用演算子を使用して、同様の効果を得ることができます。ただし、演​​算子の固定性ごとに、独自の演算子のペアを定義する必要があります。

これは機能します:

infixl 5 -|
(-|) :: a -> (a -> b) -> b
(-|) = flip ($)

infixl 5 |-
(|-) :: (a -> b) -> a -> b
(|-) = ($)

infixr 5 =|
(|=) :: (a -> b -> c) -> b -> (a -> c)
(|=) = flip

infixr 5 |=
(=|) :: a -> (a -> c) -> c
(=|) = (-|)

f b x y = if b then x else y

main = do
    putStrLn $ "qwe" -| f True |- "asd" -| f False |- "kojo"
    putStrLn $ "qwe" =| f True |= "asd" =| f False |= "kojo"

そしてプリント:

kojo
qwe

ここ-||-角かっこは左結合中置式を囲み、 =|andは|=右結合式を囲みます。

これらは独立した演算子のペアにすぎないため、誤用した場合のエラー メッセージは非常にわかりにくい可能性があることに注意してください。

于 2011-06-15T13:42:13.813 に答える
3

中置式の構文が提案されていますが、私の知る限りでは採用されていません。

if then else次のように、三項関数の使用を検討できます。

infix 0 ?
(?) :: Bool -> (t, t) -> t
c ? (t, e) = if c then t else e
于 2011-06-15T11:46:22.953 に答える
1

まあ、一つにfは、タイプがあるでしょうf :: Bool -> a -> a -> a

インフィックス設定でプレフィックス関数を使用する方法の詳細については、 http://www.haskell.org/haskellwiki/Infix_operator#Using_prefix_functions_with_infix_notationを参照してください。

うまくいけば、他の誰かが賢く、理由を説明できます

1 `f True` 3 

動作しません。

ft = f True
1 `ft` 3

正常に動作し、これは参照透過性に違反しているようです...

これを行うための「良い」簡単な方法はないように思われますが、これに適合する高レベルのパターンがいくつかあると確信しています。zipWithまたは、折り畳みなどで何かを行うことができます...

于 2011-06-15T08:18:25.517 に答える
0

なぜブール関数が必要なのですか?値が使用されない場合は、fを次のように定義してください。

f :: a -> a -> a  
f i j  
i `f` j

ブール値が本当に必要な場合は、Pvitalが提案したように、ftrueとffalseを作成し、それらを使用します。

于 2011-06-15T08:18:32.693 に答える