我对Haskell中的重复索引感到很困惑,所以我花了一些时间在它上面,但我想反馈我是否做对了。
我找到了这个redex的定义,它是循环的;
Etymology : From "reducible expression"
Definition: Redex (plural redexes): (mathematics) Something to be reduced according to the rules of a formal system.
http://en.wiktionary.org/wiki/redex
上述定义假设有人知道如何减少。所以对我来说这就像是说“蓝色是看起来很蓝的质量”,这也是循环的。
然后我找到了一篇定义redex如下的博客文章;
Any subgraph that matches a rule is called a reducible expression, or redex for short.
https://hackhands.com/lazy-evaluation-works-haskell/
这要好得多,但从字面上看,它意味着它是特定于实现的,这似乎很奇怪。换句话说,如果我可以使用不同的评估树以两种不同的方式定义myfunc,那么redex的定义会有所不同。我不认为这是真的。
似乎重要的是评估解析树,反过来,它是什么是基元的定义。我找不到Haskell原语的定义,但我发现了一个可能不完整的列表:“重要的Haskell原语函数”http://www.cs.sjsu.edu/faculty/smithj/oldclass/152f11/haskell-primitives.html
我错过了Haskell原语的真正定义吗?
继续前进,该列表有助于识别基元和非基元的一些示例。
-- Primitive: *, / , div
-- Not-Primitive (not on the list): mul
将这一切放在一起,它表示原始函数评估可以简化,作为评估树上的叶节点。减少从函数调用减少到数据点。
因此,这个定义是怎样的?
Redex: In Haskell, evaluation proceeds with the base case that any primitive function application constitutes a leaf node of the evaluation tree. Such leaves are reducible from function applications into pure data elements. Thus we define all leaf nodes as reducible expressions, or "redexs" for short.
编辑;以下是我试图容纳的一些例子,我相信这是真的。
第一个来自Graham Hutton,Haskell编程。
-- Consider these cases;
-- 1.An expression using a function
mult ::(Int, Int)-> Int -- pg.126
mult (x,y) = x*y
mult(1+2, 3+4)
-- This has 3 redexes, one for each argument and one for the call, per the book
-- 2.Now consider using '*', a primitive, instead of mul, a function,
7 + (6*8)
-- This has one redex, only the 6*8, per discussions.
-- 3.Finally, contrast to all primitives without any parentheses to indicate a new evaluation level
1 + 2*3
-- This should have zero redexes, I believe, since they are only primitive expressions which can be evaluated all at once.
答案 0 :(得分:1)
函数式语言中的redex
,一旦超出语法(即将1 + 2
从中缀翻译为(+) 1 2
),只需看起来像f x
- 即一个函数和一个参数,使得该函数尚未应用于参数。
人们不应该担心哪些事情是,而不是“原始”功能
事实上,反对Hutton,我会说1+2
有两个重新索引,因为它实际上没有结果,所以“desugared”形式是{{1} }。