标签: combinators

在scala解析器组合器中回溯?

似乎scala的解析器组合器不会回溯.我有一个语法(见底部),无法正确解析以下"stmt":

copy in to out .
Run Code Online (Sandbox Code Playgroud)

这应该很容易用回溯解析:

stmt: (to out(copy in))
Run Code Online (Sandbox Code Playgroud)

还是我错过了什么?

分析器:

type ExprP = Parser[Expr]
type ValueP = Parser[ValExpr]
type CallP = Parser[Call]
type ArgsP = Parser[Seq[Expr]]

val ident     = "[a-zA-Z\\+\\-\\*/%><\\\\\\=]+".r
val sqstart   = "\\["                          .r
val sqend     = "\\]"                          .r
val del       = ","                            .r
val end       = "\\."                          .r

def stmt: ExprP      = expr <~ end
def expr: ExprP      = ucall | call | value
def value: ValueP    = ident ^^ {str => IdentExpr(str)}
def call: …
Run Code Online (Sandbox Code Playgroud)

parsing scala combinators backtracking optional

5
推荐指数
1
解决办法
1883
查看次数

使用Define的Scheme中的Y Combinator

为了了解固定点组合器是什么和用于什么,我写了自己的.但不是用严格的匿名函数编写它,比如维基百科的例子,我只使用了define:

(define combine (lambda (functional)
                  (functional (lambda args (apply (combine functional) args))))
Run Code Online (Sandbox Code Playgroud)

我用factorial和fibonacci的函数来测试它,它似乎工作.这是否符合定点组合器的正式定义?

lisp scheme combinators lambda-calculus y-combinator

5
推荐指数
2
解决办法
2567
查看次数

组合子的类型签名与其等效Lambda函数的类型签名不匹配

考虑这个组合子:

S (S K)
Run Code Online (Sandbox Code Playgroud)

将其应用于参数XY:

S (S K) X Y
Run Code Online (Sandbox Code Playgroud)

它签订合同:

X Y
Run Code Online (Sandbox Code Playgroud)

我将S(SK)转换为相应的Lambda术语并得到了这个结果:

(\x y -> x y)
Run Code Online (Sandbox Code Playgroud)

我使用Haskell WinGHCi工具获取(\ xy - > xy)的类型签名,并返回:

(t1 -> t) -> t1 -> t
Run Code Online (Sandbox Code Playgroud)

这对我来说很有意义.

接下来,我使用WinGHCi获取s(sk)的类型签名并返回:

((t -> t1) -> t) -> (t -> t1) -> t
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义.为什么类型签名不同?

注意:我将s,k和i定义为:

s = (\f g x -> f x (g x))
k = (\a x -> a)
i = (\f -> f)
Run Code Online (Sandbox Code Playgroud)

haskell combinators lambda-calculus combinatory-logic type-signature

5
推荐指数
3
解决办法
566
查看次数

如何在魔法森林中创建一个K组合器?(模拟一只知更鸟)

回想一下,K组合器是一个常数函数.它总是返回它的第一个参数:

Kxy = x for all y
Run Code Online (Sandbox Code Playgroud)

To Mock a Mockingbird这本书中,作者提供了一个含有说话鸟类的魔法森林的例子.这些鸟有行为:

鉴于任何鸟类A和B,如果您将B的名称称为A,那么A将通过向您呼叫某只鸟的名称来回应:这只鸟我们将由AB指定.

假设森林由三只鸟A,B和C组成.至少有一只鸟可能像K组合一样吗?

下面的表格显示了魔法森林中鸟类的一组可能行为.第一列包含森林中每只鸟的名称.顶行的名称可以调用每只鸟.身体是鸟对名字的反应.例如,如果您将A的名称称为鸟A,则鸟A将以C响应(请参阅第2行第2列).简洁地说,AA = C.如果你把B的名字叫做鸟A,那么鸟A会回答B(见第2行,第3栏).简洁地说,AB = B. AC的空槽应该有什么值?

   | A    B    C
------------------
A  | C    B
B  | B    B    B
C  | A    A    A
Run Code Online (Sandbox Code Playgroud)

让我们看看我们是否可以让鸟A表现得像K组合器.上面的一组值看起来很有希望:

  • 对于所有y,AA = C且Cy = A. 也就是说,对于所有y,(AA)y = A.

  • 对于所有y,AB = B且By = B. 也就是说,对于所有y,(AB)y = B.

空槽(AC)应该放置什么值?考虑所有情况:

  • 如果AC = A则所有y的Ay值必须为C,这显然是错误的.因此,A不能是空槽的正确值.

  • 如果AC = B则所有y的By值必须为C,这显然是假的.因此,B不能是空槽的正确值.

  • 如果AC = C则所有y的Cy值必须为C,这显然是假的.因此,C不能是空槽的正确值.

因此,对于每个y,不能在空槽中放置值以满足条件(AC)y = C.

据我所知,不可能让任何一只鸟表现得像K组合器.我希望你能证明我错了.

lambda functional-programming combinators function-composition k-combinator

5
推荐指数
1
解决办法
1104
查看次数

如果需要,clojure可以评估混合arity函数链并返回部分函数吗?

假设你有三个arity 1,2和3的函数,如下所示:

(defn I [x] x)
(defn K [x y] x)
(defn S [x y z] (x z (y z)))
Run Code Online (Sandbox Code Playgroud)

clojure是否具有用于评估的评估函数或习语:

(I K S I I) as (I (K (S (I (I)))))
Run Code Online (Sandbox Code Playgroud)

返回arity 2的一个parital功能?

我正在考虑创建一个宏,它可以采用上面的简单函数定义,并将它们扩展为可以返回部分结果的多元函数.如果已经有内置或惯用的方法来实现这一点,我不想创建宏.

以下是扩展宏对上述函数的期望:

(defn I
  ([x] I x)
  ([x & more] (apply (I x) more)))

(defn K
  ([x] (partial K x))
  ([x y] x)
  ([x y & more] (apply (K x y) more)))

(defn S
  ([x] (partial S x))
  ([x y] (partial S x y))
  ([x y …
Run Code Online (Sandbox Code Playgroud)

lambda clojure combinators partial arity

5
推荐指数
1
解决办法
1542
查看次数

Lisp 中的定点组合器

;; compute the max of a list of integers

(define Y
  (lambda (w)
    ((lambda (f)
       (f f))
     (lambda (f)
       (w (lambda (x)
            ((f f) x)))))))

((Y
  (lambda (max)
    (lambda (l)
      (cond ((null? l) -1)
            ((> (car l) (max (cdr l))) (car l))
            (else (max (cdr l)))))))
 '(1 2 3 4 5))
Run Code Online (Sandbox Code Playgroud)

我想了解这个结构。有人能给这段代码一个清晰简单的解释吗?

例如,假设我忘记了 Y 的公式。我如何记住它,并在使用它很久之后重现它?

lisp scheme combinators y-combinator

5
推荐指数
1
解决办法
1866
查看次数

具有foldr和foldl的高阶函数细节

我在解释foldl的函数签名时遇到了麻烦.我理解它是如何工作的,但我不确定它与签名的关系.

我对它的细节有几个疑问

foldr :: (a -> b -> b) -> b -> [a] -> b

foldr (+) 5 [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

看起来第一个参数需要一个加法函数:

(a -> b -> b)
Run Code Online (Sandbox Code Playgroud)

在函数参数中,到底发生了什么?在这种情况下,此部分是否将最右侧的整数a应用于累加器b以产生另一个整数9?在此之后,它是否会返回一个以累加器作为参数的函数?

接下来,下面的最后两个参数是什么意思?

[a] -> b
Run Code Online (Sandbox Code Playgroud)

非常感谢.

haskell combinators fold

5
推荐指数
1
解决办法
280
查看次数

将列表组合概括为N个列表

在Scala中生成已知数量的列表的组合非常简单.你可以使用for-understanding:

for {
   elem1 <- list1
   elem2 <- list2 } yield List(elem1, elem2)
Run Code Online (Sandbox Code Playgroud)

或者您可以使用脱糖版本:

list1.flatMap( elem1 => list2.map(elem2 => List(elem1,elem2)))
Run Code Online (Sandbox Code Playgroud)

在套件之后,我想创建N个列表中的元素组合(N在运行时已知).在组合器示例之后,3个列表将是:

list1.flatMap( elem1 => list2.flatMap(elem2 => list3.map(elem3 => List(elem1,elem2,elem3)))
Run Code Online (Sandbox Code Playgroud)

所以我看到了模式,我知道那里有一个递归,但我一直在努力将它固定下来.

def combinations[T](lists:List[List[T]]): List[List[T]] = ???
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

recursion scala list combinators combinatorics

5
推荐指数
2
解决办法
845
查看次数

实现组合子演算

概念

我正在实现一个解释器,允许用户定义任意组合器并将它们应用于任意术语.例如,用户可以通过输入以下组合子定义来定义对的Church编码:

pair a b c ? c a b
true a b ? a
first a ? a true
Run Code Online (Sandbox Code Playgroud)

然后用户可以输入first (pair a b),根据先前定义的规则逐步减少:

first (pair a b)
? pair a b true
? true a b
? a
Run Code Online (Sandbox Code Playgroud)

也可以定义其他组合器,例如SKI组合子演算中使用的组合器:

S x y z ? x z (y z)
K x y ? x
I x ? x
Run Code Online (Sandbox Code Playgroud)

身份组合子也可以在头两个组合子条款所限定I ? S S K KI ? S K …

binary-tree interpreter functional-programming combinators combinatory-logic

5
推荐指数
1
解决办法
486
查看次数

用于单子的 K/Kestrel 组合器?

implicit class KComb[A](a: A) {
  def K(f: A => Any): A = { f(a); a }
}
Run Code Online (Sandbox Code Playgroud)

鉴于 K 组合器的这种实现,我们可以在应用副作用的同时链接一个值的方法调用,而无需临时变量。例如:

case class Document()
case class Result()

def getDocument: Document = ???
def print(d: Document): Unit = ???
def process(d: Document): Result = ???

val result = process(getDocument.K(print))
// Or, using the thrush combinator
// val result = getDocument |> (_.K(print)) |> process
Run Code Online (Sandbox Code Playgroud)

现在,我需要做一些类似的事情,但改用 IO monad。

def getDocument: IO[Document] = ???
def print(d: Document): IO[Unit] = ???
def process(d: Document): IO[Result] …
Run Code Online (Sandbox Code Playgroud)

monads functional-programming scala combinators higher-order-functions

5
推荐指数
1
解决办法
632
查看次数