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;可能还有其他人。
我目前正在编写基于 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;可能还有其他人。