当前位置: 首页 > 知识库问答 >
问题:

在Haskell上有可能推断出一个纯λ函数的归一化源吗?

酆英达
2023-03-14

假设一个纯λ函数是一个除了抽象和应用之外什么都没有的术语。在JavaScript上,通过对收集参数列表的各种函数应用所有抽象,可以推断出纯函数的源代码。也就是说,这是可能的:

lambdaSource(function(x){return x(x)}) == "λx.(x x)"

关于这个要点,请参见lambdaSource的代码。这个函数对我的兴趣特别有用,因为它允许我使用现有的JS引擎规范非类型化的lambda演算表达式,比我自己编写的任何简单的计算器都快得多。此外,我知道λ-微积分函数可以在unsafecoerce的帮助下用Haskell表示:

(let (#) = unsafeCoerce in (\ f x -> (f # (f # (f # x)))))
lambdaSource (\ f x -> f # (f # (f # x))) == "λ f x . f (f (f x))"

共有1个答案

周健
2023-03-14

是的,你可以,但你需要提供脊柱的类型,你的功能,所以它不工作的ULC。另见整个课堂讲稿。

但正如Daniel Wagner所说,你可以使用Hoas。

还有另一个机会:这里的东西看起来像HOAS,但实际上是FOAS,您所需要的只是通过评估进行适当的规范化(就引用而言,就reify和reflect而言)。猪工人还写了一个哈斯克尔版本的跳汰机,但我找不到它。

{-# LANGUAGE GADTs, FlexibleInstances #-}

infixl 5 #

data Term a = Pure a | Lam (Term a -> Term a) | App (Term a) (Term a)

(#) :: Term a -> Term a -> Term a
Lam f # x = f x
f     # x = App f x

instance Show (Term String) where
    show = go names where
        names = map (:[]) ['a'..'z'] ++ map (++ ['\'']) names

        go :: [String] -> Term String -> String
        go  ns    (Pure n)  = n
        go (n:ns) (Lam f)   = concat ["\\", n, " -> ", go ns (f (Pure n))]
        go  ns    (App f x) = concat [go ns f, "(", go ns x, ")"]

k :: Term a
k = Lam $ \x -> Lam $ \y -> x

s :: Term a
s = Lam $ \f -> Lam $ \g -> Lam $ \x -> f # x # (g # x)

omega :: Term a
omega = (Lam $ \f -> f # f) # (Lam $ \f -> f # f)

run t = t :: Term String

main = do
    print $ run $ s         -- \a -> \b -> \c -> a(c)(b(c))
    print $ run $ s # k # k -- \a -> a
    -- print $ run $ omega  -- bad idea

另外,不需要编写lams、#之类的东西,您可以将lambda术语的字符串表示形式解析为HOAS-这并不比打印HOAS术语更难。

 类似资料:
  • 我有一个垂直菜单,其中一些项目有一个子菜单出现在该项目的右边。这是大部分工作良好,但主菜单可能有一大堆项目在它,所以我想要一个最大高度与垂直滚动条在它。 问题是,如果我在主菜单上设置了overflow:auto,那么子菜单就不再正确显示,因为它无法溢出主菜单宽度。 下面是我的代码,其中有一个示例,网址是http://jsfidle.net/fk8p6/。如果您从.menu类中删除overflow:

  • 我有一个(相当复杂的)数据类型: 现在我发现自己需要另一个数据类型…有两个构造函数。一个与的相同;另一个只存储一个。我有什么选择? 虽然这会起作用,但它也允许类似这样的东西,这是没有意义的。

  • 部分答案可能来自领域理论。如果我理解正确的话,的元素并不全是集合论函数(根据康托定理,这些函数比大),而只是连续函数。如果是,定义这种连续性的拓扑是什么?为什么类型的Haskell术语对它是连续的?

  • 我正在制作一种强类型的玩具函数式编程语言。它使用Hindley Milner算法作为类型推断算法。 在实现该算法时,我有一个问题,即如何推断相互递归函数的类型。 和是相互递归的函数。现在,当类型检查器推断函数的类型时,它也应该能够推断函数的类型,因为它是一个子表达式。 但是,在那一刻,函数还没有定义。因此,显然,类型检查器甚至不知道函数的存在,以及函数的类型。 真实世界的编译器/Inteprete

  • 该函数获取一个整数和一个数字,如果该数字在整数中出现偶数次,则返回true,否则返回false。 例如: 如果 和 ,则该函数应返回 。 如果 和 ,则该函数应返回 。 这是我到目前为止得到的,我被卡住了……这是家庭作业,所以请不要写答案,而是提示我并帮助我自己完成。