Haskell 函数返回其输入

Haskell Function returning its input

我目前正在编写基于 Haskell 的替换函数(Lambda 微积分)。

data Term = Var String 
          | Application Term Term
          | Lambda String Term

该函数接受一个术语 t1、字符串 s 和一个术语 t2。该函数应将 t1 中每次出现的 s 替换为 t2.

subst :: Term -> String -> Term -> Term
subst (Lambda y e) x v = if x == y then (Lambda y e) else let e' = (subst e x v) in (Lambda y e')
subst (Var y) x v = if x == y then v else (Var y)
subst (Application e1 e2) x v = Application (subst e1 x v) (subst e2 x v)

当我尝试调用该函数时,我收到以下信息:

输入

 subst (Lambda "x" (Application (Var "x") (Var "y"))) "y" (Var "f")

输出

subst (Lambda "x" (Application (Var "x") (Var "y"))) "y" (Var "f")
  :: Term

是我输入错误还是我的功能有问题?

问题是您的 Term 类型缺少 Show 实例,因此无法显示。解释器告诉您表达式 foo 产生了类型 SomeType 的结果,但它无法打印比这更多的详细信息,因为 SomeType 不支持 Show。因此,您的函数显然已成功返回了一些值,但您不知道是什么值。您可以通过对结果进行模式匹配来检查它。但是您可能只想将 deriving Show 添加到类型定义中,以便 repl 可以打印它获得的值。

现在,最流行的 repl GHCI 通常不会以这种方式运行:如果您尝试在没有 Show 实例的情况下显示一个值,您只会得到一个错误。但是其他一些类似 GHCI 的工具会再次打印表达式及其类型。我知道的一个是 Emacs 中的 interactive-haskell-mode;可能还有其他人。