fac n = if n < 2 then 1 else n * fac (n-1)
main = do
putStrLn "Enter a number: "
number <- getLine
print $ number >>= fac
Run Code Online (Sandbox Code Playgroud)
我不知道如何在没有if语句的情况下编写递归因子函数.我们的教授说有关lambda演算的事情.
Application has higher precedence than abstraction.
Run Code Online (Sandbox Code Playgroud)
从这个意义上说,什么是 lambda 演算抽象?我很困惑有什么优先权?
我有一个项目,我们正在提高在 Haskell 中连接列表的速度。我是 Haskell 的新手,对AList ([a] -> [a])特别是如何将我的 AppendedList 转换为常规列表感到困惑 。任何帮助,将不胜感激。
newtype AppendedList a = AList ([a] -> [a])
-- List[5] is represented as AList (\x -> 5:x)
-- This function takes an argument and returns the AppendedList for that
single :: a -> AppendedList a
single m = AList (\x -> m : x)
-- converts AppendedList to regular List
toList :: AppendedList a -> [a]
toList = ???
Run Code Online (Sandbox Code Playgroud) haskell functional-programming list concatenation lambda-calculus
在这种对letlambda 演算版本的处理let中给出
(\f.z)(\x.y)
Run Code Online (Sandbox Code Playgroud)
用词
ff x = y 在表达式中 由 定义z,然后作为
let f x = y in z
Run Code Online (Sandbox Code Playgroud)
我从初学者的角度知道 Haskell 是如何let工作的,即定义遵循let并且表达式(对这些定义做一些事情)遵循in.
let <definitions> in <expression>
Run Code Online (Sandbox Code Playgroud)
但是这种最一般的 lambda 演算描述令人困惑。例如,我假设可能有一个 Haskell lambda 函数版本的let f x = y in z. 有人可以在 Haskell 中写出这个 - 也许举一两个例子 - 吗?只是猜测,似乎第一个 lambda 函数需要第二个 lambda 函数——不知何故?
(\x -> y)(\f -> z)
Run Code Online (Sandbox Code Playgroud)
但这只是一个猜测。
我正在学习一些 lambda 演算,我很好奇的一件事是完全抽象的函数如何实际应用于指令中。让我们看下面的例子,我允许小的自然数(作为给定的)和一个TRUE FALSE定义。
例如,让我们使用以下代码,其计算结果应为5:
# using python for the example but anything would suffice
TRUE = lambda x: lambda y: x # T = ?ab.a
FALSE = lambda x: lambda y: y # F = ?ab.b
TRUE(5)(2) # T('5')('2')
Run Code Online (Sandbox Code Playgroud)
这如何在类似 lambda 演算的指令中实现以评估这一点?我想到的一件事是“取消 lambda 化”它,所以它只是出现如下:
// uncurried
int TRUE(int x, int y) {
return x;
}
int FALSE(int x, int y) {
return y;
}
TRUE(2, 5);
Run Code Online (Sandbox Code Playgroud)
可能会出现以下情况:
SYS_EXIT = 60
.globl _start
TRUE: # faking …Run Code Online (Sandbox Code Playgroud) compiler-construction assembly functional-programming compilation lambda-calculus
假设函数将两个不同类型的变量作为其输入(例如,一个变量在C语言中为int,一个变量在C语言中为char)并返回一个变量Int.
如果此函数被编码为Haskell或lambda演算代码,函数的类型将如何?
所以假设函数有类型Int -> (Char -> Char) -> Int.这意味着什么?这是否意味着它接收int变量作为输入并运行函数(Char -> Char)和输出Int变量?
我正在尝试编写一个lambda演算解析器,我定义的语法似乎不在LLR中:
E ::= x | \x.E | EE | (E)
Run Code Online (Sandbox Code Playgroud)
我减少左递归:
E ::= xE' | \x.EE' | (E)E'
E'::= EE' | <empty>
Run Code Online (Sandbox Code Playgroud)
似乎不对,有人可以帮忙吗?
compiler-construction haskell lambda-calculus context-free-grammar left-recursion
我想快速正确地减少函数以在Haskell中指向自由格式.我更愿意产生相当可读的结果.我该怎么办呢?
我必须将以下lambda表达式减少为WHNF,但我不太清楚如何做到这一点:
(?x y. x 3) (+ 4) (+ 6 7)
Run Code Online (Sandbox Code Playgroud)
那么,我该怎么做?呼叫减少名称?
这个表达式(其他例子)(?z x. (?x. x) z) x在WHNF中了吗?
haskell lambda-calculus lazy-evaluation weak-head-normal-form
在其中,我尝试创建Krivine抽象机。我需要构建的数据类型之一是环境。这样构建环境:
我们有x,一个“ Var”(这只是字符串的同义词)我们有N,一个“ Term”(这是一个Lambda项)
因此,环境E的定义为:
E =(x,N,E)·E.
因此,环境就是元组列表。每个元组包含一个Var(字符串),一个Term和一个环境列表(可能为空)。
我正在定义“ Env”,如下所示:
data Env = Env (Var, Term, [Env])
Run Code Online (Sandbox Code Playgroud)
在我看来,这似乎应该起作用。但是,当我尝试使用Env时,我得到:
*Main> ("y", Lambda "z" (Variable "z"), []) :: Env
<interactive>:166:1: error:
* Couldn't match expected type `Env'
with actual type `([Char], Term, [a0])'
* In the expression: ("y", Lambda "z" (Variable "z"), []) :: Env
In an equation for `it':
it = ("y", Lambda "z" (Variable "z"), []) :: Env
Run Code Online (Sandbox Code Playgroud)
“ y”肯定是[Char]
Lambda“ z”(变量“ z”)绝对是Term类型的
空列表绝对是列表!
我觉得问题可能出在空列表上,但绝对不可缺少的是环境中可以存在一个空列表(这是基本情况)。
我现在一直在努力工作几个小时,一点也不运气。任何帮助是极大的赞赏。
lambda-calculus ×10
haskell ×8
abstraction ×1
apply ×1
assembly ×1
compilation ×1
lambda ×1
let ×1
list ×1
pointfree ×1
recursion ×1