我想在 Haskell 中实现一个不区分顺序的功能应用程序版本。通过一点背景知识:自然语言语义中的一个突出传统(源自 Richard Montague 等)将各种类型的 lambda 函数指定为表达式的语义值 (sv's)。句子的真值是通过对句子成分的 sv 执行功能应用来计算的。举一个简单的例子,考虑:
tl = [1..10]
bill :: Int
bill = 1
tall :: Int -> Bool
tall = \x -> x `elem` tl
将句子“Bill is high”想象成一棵树,左叶被“Bill”占据,右叶被“tall”占据。我们通过将右叶的 sv应用于左叶的 sv来计算句子的真值。现在考虑'Some man is high':这里左叶被'some man'占据[其sv类型为:: (Int -> Bool) -> Bool],右叶被'tall'占据[其 sv 的类型为 :: (Int -> Bool)]。我们通过将左叶的 sv应用于右叶的 sv来计算句子的真值。
因此,在这个系统中,给定一棵具有左叶a和右叶b的树,我们首先检查哪个叶在另一个的域中,然后相应地应用功能应用:如果a在b的域中,我们做b (a),而如果b在a的域中,我们做a(b)。
我将如何在 Haskell 中实现这种“顺序不敏感”的功能应用程序?我编写了一些函数,通过解析结果来确定哪个叶子在另一个域中
show (typeOf a)
对于一片叶子 a。然而,这在我看来是不必要的麻烦。如果您尝试评估,Ghci 会给出错误
bill tall
因此,检查哪一项在另一项的域中的一种简单方法是尝试将一项应用于另一项,并查看是否导致错误/异常。那么,我的问题是:如何捕获由类型不匹配导致的异常?也就是说,我如何捕获这种非 IO 异常?