Haskellで機能アプリケーションの順序に依存しないバージョンを実装したいと思います。少し背景として:自然言語のセマンティクスの著名な伝統(とりわけリチャードモンタギューに由来)は、式のセマンティック値(sv)としてさまざまなタイプのラムダ関数を割り当てます。文の真理値は、文の構成要素のsvに対して機能的な適用を実行することによって計算されます。簡単な例として、次のことを考慮してください。
tl = [1..10]
bill :: Int
bill = 1
tall :: Int -> Bool
tall = \x -> x `elem` tl
「Billistall」という文は、左の葉が「Bill」で占められ、右の葉が「tall」で占められている木と考えてください。右葉のsvを左葉のsvに適用することにより、文の真理値を計算します。ここで、「ある人は背が高い」と考えてください。ここでは、左の葉が「ある人」[svのタイプ::(Int-> Bool)-> Bool]で占められ、右の葉が「背の高い」で占められています。 [svのタイプは::(Int-> Bool)]。左の葉のsvを右の葉のsvに適用することにより、文の真理値を計算します。
したがって、このシステムでは、左葉aと右葉bのツリーが与えられた場合、最初にどちらの葉が他方のドメインにあるかを確認し、それに応じて機能適用を適用します。aがbのドメインにある場合、 bを実行します。(a)、一方、bがaの定義域にある場合、 a(b)を実行します。
この種の「順序に依存しない」機能アプリケーションをHaskellに実装するにはどうすればよいですか?の結果を解析することにより、どのリーフが他のドメインにあるかを判別するいくつかの関数を作成しました。
show (typeOf a)
葉の場合a。しかし、これは私には不必要に面倒なようです。たとえば評価しようとすると、Ghciはエラーになります
bill tall
したがって、どのアイテムがもう一方のドメインにあるかを確認する簡単な方法は、一方のアイテムをもう一方のアイテムに適用して、エラー/例外が発生するかどうかを確認することです。それでは、私の質問は、型の不一致に起因する例外をどのようにキャッチするかということです。つまり、この種の非IO例外をキャッチするにはどうすればよいですか?