【发布时间】:2012-04-24 17:33:17
【问题描述】:
我想在 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”占据。我们通过将 right 叶的 sv 应用到 left 叶的 sv 来计算句子的真值。现在考虑'Some man is high':这里左叶被'some man'占据[其sv的类型为:: (Int -> Bool) -> Bool],右叶被'tall'占据[其 sv 的类型为 :: (Int -> Bool)]。我们通过将 left 叶的 sv 应用到 right 叶的 sv 来计算句子的真值。
因此,在这个系统中,给定一棵具有左叶 a 和右叶 b 的树,我们首先检查哪个叶在另一个域,然后相应地应用功能应用:如果 a 在 b 的域中,我们做 b(a ),而如果 b 在 a 的域中,我们做 a(b)。
我将如何在 Haskell 中实现这种“顺序不敏感”的功能应用程序?我编写了一些函数,通过解析
的结果来确定哪个叶子在另一个的域中show (typeOf a)
对于一片叶子 a.然而,这在我看来是不必要的麻烦。如果您尝试例如,Ghci 会给出错误。评估
bill tall
因此,检查哪一项在另一项的域中的一种简单方法是尝试将一项应用于另一项,然后查看是否会导致错误/异常。那么,我的问题是:如何捕获由类型不匹配导致的异常?也就是说,我如何捕获这种类型的非 IO 异常?
【问题讨论】:
标签: haskell exception-handling functional-programming