Functional programming 函数式编程中的签名/类型(OCaml)

我开始学习函数式编程(OCaml),但我不理解关于fp的一个重要主题:签名(我不确定它是否是一个正确的名称)。当我键入某些内容并使用ocaml编译时,我会得到例如: # let inc x = x + 1 ;; val inc : int -> int = <fun> 给出一个输出: val something : (’a -> ’b -> ’c) -> (’a -> ’d -> ’b) -> ’a -> ’d -> ’c =

Functional programming μ-函数式语言中的递归(mu递归)函数

我想知道如何用函数式编程语言编写?据我所知,答案正是你给出的。迭代所有参数,直到找到一个返回零的参数。对于多个参数的函数,可以对角化。i、 (0,0),(1,0),(0,1),(1,1),(2,0),(2,1),(0,2),(1,2),(2,2)等。你能详细说明你的问题吗?用函数语言编写的每个函数都是mu递归的。我很困惑。我的意思是最小化运算符μ,如中所述:“直觉上,最小化查找导致函数返回零的最小参数,前提是函数为所有较小的参数定义。”这是从0到第一个x的明显迭代,使得f(x)=0吗?(对于一元

Functional programming Go有标准的函数原语吗?

标准库(或流行的约定库)是否允许我在切片/映射上映射、过滤、折叠等?否。Go的类型系统不适合这些原语的通常形式,因为它缺少泛型 另请参见golang nuts。虽然Go没有这些原语,但应该指出的是,您通过通道与goroutine对话的标准Go抽象将在异步函数中为您提供完全等效的功能。@ross light很好。获得同等的功能并不完全是微不足道的。但在实践中仍然是可行的。也可以使用高阶函数。但由于缺少泛型,因此很难按泛型执行任何操作。@RossLight“未找到页面”:(

Functional programming 标准ml值限制错误

嗨,我需要帮助理解为什么我在这段代码中得到一个值限制错误,以及如果可能的话我如何解决它 特别是在val cnil中,我试图创建一个空的CLIST结构来匹配签名,但我一直得到这个值限制错误 谢谢你的帮助 structure Clist : CLIST = struct open CML datatype 'a request = CONS of 'a | HEAD datatype 'a clist = CLIST of { reqCh : 'a request chan, re

Functional programming 有人能用外行的术语解释一下什么是函数式语言吗?

可能重复: 恐怕维基百科没有给我带来更多。 非常感谢 PS:这个过去的帖子也很好,但是我很高兴我又问了这个问题,因为新的答案很好-谢谢 首先了解a是什么(从维基百科) 图灵机是一种根据规则表操纵磁带上的符号的设备。尽管图灵机很简单,但它可以用来模拟任何计算机算法的逻辑,并且在解释计算机内部CPU的功能时特别有用 这是关于(来自维基百科) 在数理逻辑和计算机科学中,lambda演算,也称为λ演算,是研究可计算递归函数、la可计算性理论以及相关现象(如变量绑定和替换)的形式系统 函数式编程语言使用

Functional programming 理解多提示分隔连续体的API

本文介绍了一种用于多提示分隔连续体的API 我的问题涉及推送分包的类型:('a,'b)分包->(单元->'a)->'b。为什么这种类型不是('a,'b)subcont->'a->'b?此外,为什么分包有单独的类型:为什么不简单地('a,'b)subcont='a->'b?我几乎可以肯定这有一个很好的理由,因为Oleg使事物尽可能优雅(但不是更优雅) 谢谢 为什么不('a,'b)分包->'a->'b? 我认为这与推送提示的原因相同,因为推送提示更容易理解push_提示符p(fun()->e)直观上

Functional programming 什么是绑定事件?

我在学习 我有几个简单的问题: 什么是绑定? 什么是事件? 什么是绑定事件? 我问这些问题是因为书上说: 我没有读过这篇文章,我只是一个谦逊的实践者(不是理论家),但我很确定我知道这些术语的含义 绑定是名称与值的关联 引用是名称在表达式中的单个外观。如果名称出现两次,则出现两次 绑定引用是名称在点中的外观,使其绑定到值。在中,设x=4 In x+2中x的第一次出现是绑定出现,第二次只是出现 编辑:引用的文本告诉您的是,当一个名称出现在一个模式中时,模式的成功匹配会导致名称绑定到一个值。我编辑

Functional programming Erlang:优雅的元组到列表/1

我将通过Armstrong的“编程Erlang”介绍自己认识Erlang。一个练习是编写tuple_to_list/1bif的一个实现。我的解决方案对我来说似乎很不雅观,特别是因为我使用了helper函数。有没有更像Erlang的方法 tup2lis({}) -> []; tup2lis(T) -> tup2list_help(T,1,tuple_size(T)). tup2list_help(T,Size,Size) -> [element(Size,T)]; tup2li

Functional programming 如何从列表中访问类型中的值

这是我项目的结构 type A{ t1; t2; } and B = var of A and C = B list type D = C list 现在我有一个只有D作为参数的函数。每次调用此函数时,我都需要为t2指定一个唯一的值 我想我不能直接给t2赋值,而是需要返回一个新类型,新值为t2。我想这就是函数式语言的工作原理 我的问题是我不知道如何使用这个函数访问这个值 我还在学习语法,如果有人能给我举个例子,那就太好了你的问题一点也不清楚 如果您希望a成为一个可以更改其中一个字段的记录,那

Functional programming J检查板

我需要使用J来打印棋盘格,我的函数给定一个奇数,需要创建一个NxN矩阵,并在每隔一个框中放置一个“X”。我已经做了矩阵,但我不能计算出每个其他盒子的部分 到目前为止我所拥有的 N =: 3 checker =: (2$N)$ <'X' N=:3 checker=:(2$N)$最简单的方法是使用a:,虽然这样做有效,但它比我们在课堂上学到的任何东西都要高级@起初,我想得太多(或过于笼统);我在答案的顶部添加了一个更简单、更直接的方法。这很可能就是你的老师想要的。@MichaelMiner

Functional programming 使用Java8的可选选项避免列表处理中的“空检查”

在类站点中,我有两个实用方法 第一个是parseStub,如果没有错误发生,它会将站点解析为主站点;否则,它将返回null。使用可选选项: 注意,在上面的代码中,我再次引入了null。 如何使用Optional来避免null和FilterObject::nonNull 这里有一个方法: return sites.stream() .map(Site::parseStub) .filter(Optional::isPresent) .map(Opti

Functional programming 练习310&引用;“如何设计程序”;

我希望你能帮我做这个练习。 练习310。按顺序设计函数。它使用一个二叉树,并生成树中所有ssn编号的序列,这些编号在查看树图形时从左到右显示 我的解决方案只是使用节点下方的内容反转每个左侧节点,然后访问右侧节点。虽然顺序正确,但答案的格式不正确。这是我的代码: (define-struct no-info []) (define NONE (make-no-info)) (define-struct node [ssn name left right]) ; A BinaryTree (sho

Functional programming 使用Ramda进行函数式编程:你能用一个参数数目不限的函数吗

假设我有3个数组 var first = [0, 1, 2, 3]; var second = [0, 1, 2, 3]; var third = [0, 1, 2, 3]; 我想做一个curried函数,其中我设置了第一个参数,指示我想在作为参数传递的数组中添加哪个单元格……理想情况下,我希望函数能够接受无限数量的数组 例如: mycurriedfunction(1)意味着我希望访问传入的数组中单元格1处的值,并将它们相加 因此,我们要: mycurriedfunction(1)(第一个)将

Functional programming 如何使用输入的plai从Racket中的列表中筛选出第一个匹配项?

在使用plai输入的Racket中,我试图在列表中找到一个元素,并删除它找到的第一个元素。然后,它将返回它看到的第一个被删除的元素的列表。 以下是一个例子: "(1 2 3 2 5) 过滤掉前2个,您应该得到: "(1 3 2 5) 这就是我目前正在做的,但它返回:'(1 3 5) (滤波器(λ(x)(不等于?x2))'(12325)) 因此,当我只想删除第一个事件时,我当前正在执行的操作将删除所有事件。不知道Racket,但您可以将其定义为如下的分段函数: --将空列表的myFilter定义为

Functional programming 在不使用嵌套映射的情况下为列表列表实现映射函数

我给自己设置了以下挑战(但失败了): 我想写一个map函数,map f lofls,它接受一个函数f'a->'b和一个列表,lofls'a list list,并在列表的每个元素上应用函数f。我添加的约束是,不允许我对列表使用嵌套映射,我必须递归地这样做 我试着用F#来做,但任何语言都可以。有什么想法吗 编辑 这是我的尝试(虽然有效,但很难看,我也不喜欢使用rev…) (我也意识到这已经以更简洁的形式发布了)让我们一步一步走,从简单到复杂 这是您希望map函数具有的签名: ('a->'b)->'

Functional programming '的性能影响是什么;功能性';生锈?

我沿着铁锈的轨道走。我有相当多的C/C++经验。我喜欢Rust的“功能”元素,但我关心的是相对性能 我解决了以下问题: pub-fn-encode(源代码:&str)->String{ 让mut retval=String::new(); 让firstchar=source.chars().next(); 让mut currentchar=匹配firstchar{ 一些(x)=>x, None=>返回retval, }; 让mut currentcharcount:u32=0; 对于source

Functional programming 咖喱中的N元函数和N+之间有什么区别吗;Prolog中的一元关系?

与它的表亲Haskell不同,它允许您为函数指定多个值: foo 1 2 = 3 foo 1 2 = 4 它确实(或其他一些研究)探索了这种非决定论的含义 这使得它类似于Prolog(特别是由于类型系统和语法),您可以在其中声明 foo 1 2 3. foo 1 2 4. 从语义上讲,N元Curry函数和N+1元Prolog关系之间有什么区别吗?Curry和Prolog之间的区别在于依赖关系 在参数和结果之间,这些参数和结果是 用于咖喱。与Haskell类似,Curry使用了lazy(nee

Functional programming letrec的好处是什么?

在阅读《老练的阴谋家》时,我开始了解letrec。我理解它的功能(可以用Y组合器复制),但这本书使用它来代替对已存在的defined函数的重复,该函数对保持静态的参数进行操作 一个使用defined函数的旧函数的示例,该函数在自身上重复出现(无特殊情况): 现在,以使用letrec的相同函数为例: (define (substitute new old l) (letrec ((replace (lambda (l) (cond ((n

Functional programming 有什么Clojure原则吗?

Clojure有什么原则吗 a。像Java这样的面向对象语言 b。或者其他更具启发性的方法,比如“告诉别人不要问”、“喜欢组合而不是继承”、“与接口对话” 是否有任何设计模式(用于灵活的代码) 像面向对象的封装这样的函数式编程基础的反作用是什么 知道这些方面的资源吗?1a)我不知道这样的事情,但每本关于FP的书都会做类似的事情 1b) “偏好组合vs继承”-->已经得到处理,因为您是从FP开始的 “与抽象对话”->更一般 “尽可能地懒惰” “避免状态” “使用纯函数!!!” 列表项 2.)

Functional programming 穷举模式

我正在学习ML,有人能解释一下什么是穷举模式吗?如果模式匹配不能失败,那么它就是穷举模式。即,所有可能发生的情况都包含在模式中 例如,以下模式匹配并不详尽,因为它不包括列表为空的情况: fun sum (x::xs) = x + sum xs 以下内容是详尽的,因为这两种情况都包括在内: fun sum (x::xs) = x + sum xs | sum [] = 0 通常,代数数据类型上的模式匹配是穷举的,当且仅当存在默认情况或所有构造函数都存在情况且每个子模式的匹配是穷举的。我从这

Functional programming D中的特征可以用于类型类吗?

我是D新手,我正在寻找一种很好的方法来使用类似Haskell的类型类编程,例如D中的函子、幺半群等 在Tango或Phobos中是否实现了类似的功能 我听说过一些特性,它们支持对某些属性进行编译时类型检查。它们可以用于类型类吗 我尝试了一点模板专门化,并得出以下结论: // Monoid.d // generic Monoid gets called when there is no instance of Monoid for Type T class Monoid(T) { prag

Functional programming 函数式编程和自注释代码——这真的可能吗?

由于我有很多空闲时间花在ATM上,我在这里阅读了一些关于代码注释和文档的线程/注释。 作为这里的大多数人,我也认为您应该编写代码,以便尽可能容易阅读和自我评论。 另一方面,我是一个狂热的FP迷——是的,如果你以正确的方式编写代码,它将在FP中非常可读——或者我是这么认为的。 问题是,在FP世界中,微小的事物会产生巨大的差异。如果您的同事不完全理解FP,他可能能够“阅读”代码的缩进,但无法修改或完全理解它。这代表像Haskell这样的语言,其中a'.'或'$'有很大的区别,也代表像VB.NET中的

Functional programming 实施冈崎';为什么';它不编译吗?

(可以在中找到一个最小的非编译示例,请参阅下面的更多背景。) 我试图实现冈崎纯功能数据结构第10章中介绍的自举堆。下面是我的非编译代码的简化版本 我们要实现具有以下签名的堆: module type ORDERED = sig type t val compare : t -> t -> int end module type HEAP = sig module Elem : ORDERED type heap val empty : heap val

Functional programming 将多个变量(图像->颜色列表)作为过程参数传递

我正在尝试创建一个程序,它将接受两个颜色列表。因为此过程位于另一个过程本地。在传递参数时,我需要转换图像->颜色列表。我尝试了不同的方法来声明它们,但编译器错误显示: 找到一个多次使用的变量:图像->颜色列表 或 应为变量,但找到了部分 (define (colourLists image->color-list bg image->color-list fg)) (define (colourLists (image->color-list bg) (image->

Functional programming 展平列表列表

一般来说,我对Scheme和函数式编程是新手。有人能解释一下这个代码吗?特别是什么是kons和knil?目标是将列表列表展平 (define (fold1 kons knil lst) (if (null? lst) knil (fold1 kons (kons (car lst) knil) (cdr lst)))) 我相当肯定kons是一个函数,因为它被应用于两个参数,但仍然不能完全确定它的功能。这是一个(奇怪的)折叠 这是一个广义的折叠过程。在Li

Functional programming OCaml中不可变数据的D-like切片

OCaml是否有像不可变数据的D片那样的片?它似乎非常适合OCaml范式,您可以避免每次使用尾部递归执行任何类型的处理时都需要不断地反转列表,因为您可以从两端访问/切片列表。是否难以实施 例如,如果OCaml列表的行为类似于切片,我可以说 let merge lhs rhs = merge_helper lhs rhs [] let rec merge_helper lhs rhs res = match lhs with | [] -> res ^ rhs

Functional programming 编写scheme函数

如何编写一个函数,该函数将评分函数(我已经编写)和字符串对列表作为输入(我对如何编写感到困惑),并返回一个修改后的字符串对列表,其中返回的列表应包含输入中的所有最佳字符串对,并根据输入函数进行评分 输入示例: '( ("hello" "b_low") ("hello_" "b_l_ow") ("hello" "_blow") ("hello" "blow") ("h_e_llo" "bl_o__w") ) 示例输出: ( ("hello" "b_low") ("hello_" "b_l_ow"

Functional programming 功能性;同时性;?

在这里,我们谈到了函数式编程。具体来说,作者说: 同时性意味着我们假设lambda演算中的一个语句是同时求值的。平凡的功能: λf(x) ::= x f(x) 定义为x插入的任何内容的无限序列。逐步展开如下所示: 0 - f(x) 1 - x f(x) 2 - x x f(x) 3 - x x x f(x) λarg.body λx.x λname(x).(.... some body containing (name arg) in it somewhere) 关键是

Functional programming 定义参考透明度和确定性函数之间有什么区别?

参考透明度(): 如果表达式可以是透明的,则称其为引用透明的 替换为其值,而不更改程序的行为(在 换句话说,生成一个具有相同效果和输出的程序 在相同的输入上) 还有(): 对于相同的参数,函数总是返回相同的结果是错误的 称为参照透明度 确定性函数(): 确定性函数总是在任何时候返回相同的结果 使用一组特定的输入值调用 如果我们谈论的是确定性函数,我们指的是引用透明性?如果我们谈论的是引用透明性,我们指的是确定性函数?请注意,您对引用透明性的定义特别提到“相同输入上的相同效果和输出”。如果您的表达

Functional programming 如何定义以下函数的类型配置文件?

我必须定义此函数的类型配置文件: compose(f, g, x) = f(g(x)) 结果应该如下,但我真的不明白为什么 (’a -> ’b) * (’c -> ’a) * ’c -> ’b 如果你看一下compose的定义,你首先把g'c->'a应用到x,所以你从a'c到a。f'a->'b然后应用于所述的'a并返回a'b,因此整个合成函数从'c'到'b'。推理与您的另一个问题中的推理基本相同: 3个参数-签名a->c->e->f 前两个是一元函数a=a->b和c=c->

Functional programming 在管道函数内部时检入值

如果R.cond解析一个未定义的值,则应执行pipe函数并将该值传递给pipe函数 const publishClient = (resp, cb) => { console.log('Publishing ', resp); cb() } // Applying same process const format = (letter) => ({'letter': letter}); const concact = R.curry((num, letter) =>

Functional programming 如何在闭包中获取多个参数并打印它们?

我调用了env::vars_os,希望以功能性方式打印所有这些文件: env::vars_os() .map(|(k, v)| println!("k : {:?}, v : {:?} \n", k, v)); 这不会打印任何内容,但文章指出这应该是可能的。查看,我们看到它是元组的迭代器,具有语法(a,b)。那么,将代码更改为 env::vars_os() .map(|(k, v)| println!("k : {:?}, v : {:?} \n", k, v)); 我们应该

Functional programming 如何使if语句无点

我有以下的if声明: var formatCity = obj => R.both(has('city'), has('state'))(obj) ? appendCommaToCity(obj) : obj 我想免费提供此代码点,但无法找到绕过if语句的方法。使用-或其专业化,这非常简单: 这其实很简单——或者说它的专业化: const formatCity = R.when(R.both(has('city'), has('state')), appendCommaToCi

Functional programming Coq:生活在集合中的非列表数据结构?

如果我有以下行: Definition Foo : Set := list nat. 然后我编译没有问题 但是,假设我想对Coq.Lists.ListSet执行相同的操作,这是一个将有限集合表示为列表的库: (*Section first_definitions. Variable A : Type. Definition listset := list A.*) Definition Bar : Set := listset nat. 我得到以下错误: The term "listset

Functional programming coq中应用等式的证明

我有一个这样的应用程序序列(f(f(fx)),是一个任意函数和任意应用程序序列。 我想证明f(xy)和(xy)),x=(ff…)和y=任何值,都是相等的。 我需要以下代码中的证明: Fixpoint r_nat {A : Type} (a : nat) : A -> (A -> A) -> A := match a with |S n => fun (x0 : A) (a0 : A -> A) => r_nat n (a0 x0) a0 |

Functional programming 不正确的语法导致;此值不是函数,无法应用";

我得到此值不是函数,无法应用。我认为这是由语法错误引起的。此代码有什么问题?函数应用程序的F#语法是: let compoundInterest initial monthly years (interest : decimal) = interest * (1.0m + interest) pown years compoundInterest 100.0m 100.0m 5.0m 0.1m 也就是说,每当编译器看到一个表达式后跟空格,然后后跟另一个表达式时,编译器就会将其视为函数

Functional programming 如何直接将val绑定到SML中的选项值?

val SOME i=Int.fromString e 我的代码上有这样一行代码,smlnj向我显示了这个警告 vm.sml:84.7-84.32 Warning: binding not exhaustive SOME i = ... 这是坏习惯吗?我应该使用一个函数来处理该选项,还是我遗漏了什么?如果您只是在处理一个小脚本,您只需运行一次,这并不一定是坏做法:如果Int.fromString e失败(并返回NONE而不是SOME),然后,值绑定将失败,并向相应的处理程序

Functional programming 继任者上的Idris模式匹配(下一个值)

在下面的函数中,我是(sk)上k的后继函数的模式匹配 如果需要,是否可以在函数体上使用该值 另一种解决方案是在k上匹配,并在body函数上使用k的先行词,因此,解决同一问题的另一种形式或这种模式匹配提供了我看不到的任何其他优势?对于第一个问题 Nat的(原始)定义为 data Nat = Z | S Nat 我们可以在以下方面进行匹配: 使用k 建设者。这里是Z或sk。当然,sk将绑定一个不同的值到k,而不是只匹配k 一旦您匹配了一个值,您就可以使用Nat执行所有您通常可以执行的操作,包括

Functional programming 是否可以将依赖类型变量连接到Idris中该数据类型的属性

我正在Idris中开发一个红黑树实现。在该实现中,节点除了携带关于其值和颜色的信息外,还携带关于其黑色高度的信息(即从该节点到任何叶子的黑色节点的数量,不包括自身) 我试图明确节点定义与子节点的黑色高度的关系。NodeEq-两个孩子的bh相同,NodeLh表示左孩子的bh大于右孩子的1,NodeRh是NodeLh的反面 数据颜色=红色|黑色 均衡器颜色:颜色->颜色->颜色 均衡器颜色红色=真 eq_颜色黑色=真 均衡器颜色=假 Eq(颜色)在哪里 (==)=eq_颜色 数据树:Nat->col

Functional programming 寻找一个小项目做为介绍函数式编程

最近我读了很多关于函数式编程的书,最后我决定理解函数式编程的最好方法可能就是开始使用它。我花了一些时间研究函数式语言的不同评论,我认为我选择Haskell是因为它被认为是优雅的,而且它似乎是走向纯函数式语言的方向。最近我一直在用Java、Python和Perl编写代码,所以我想在这个练习中,我不妨选择一种语言,它迫使我只使用函数式编程思想,而不是像Scala或Lisp这样也支持命令式编程的语言(但是如果有人对此有想法或意见,我很乐意听取他们的意见) 无论如何,学习函数式编程思想的全部要点(至少对

Functional programming coq中未通过自反性建立的eta等价项的相等性

编辑:我应该说一下我目前是如何解决这个问题的。我定义了一个表示排列相等的原则 Lemma permInd : ∀ (U : Type) (A : Ensemble U) (φ ψ : Perm A), φ ↓ = ψ ↓ → φ ↑ = ψ ↑ → φ = ψ 然后将引理应用到下面给我带来麻烦的证明上下文中,证明了eta等价项是相等的。因此,当这些术语嵌套在记录中时,问题似乎表现为eta等价。但我不擅长处理唱片,所以我可能遗漏了一些东西 原件: 我很难证明嵌套在记录字段中的eta等价项的相

Functional programming OCaml中的弱多态性

我对OCaml中的弱多态性有点困惑 请参阅下面的代码段,在这里我定义了一个函数记住: let remember x = let cache = ref None in match !cache with | Some y -> y | None -> cache := Some x; x ;; 编译器可以推断多态类型'a->'a,并且缓存在本地使用 但是当我把上面的代码修改成 let remember = let cache =

Functional programming 返回列表中的位置(ML)

定义一个函数,给定一个列表L、一个对象x和一个正 整数k,如果x,则返回x在L中第k次出现的位置 在L中至少出现k次,否则为0。例如,如果L是 [#“a”、#“b”、#“c”、#“b”],x是#“b”,k是2,那么函数 返回4 对于这个问题,我不能使用任何辅助函数,也不能使用长度函数。关于如何解决这个问题,你有什么想法吗?假设find是你必须实现的功能。从描述中可以直接看出两件事: find返回一个整数 find至少接受三个参数(L、x和k) 此外,列表上的函数通常区分两种情况:要么给定列表

Functional programming 如何在两个变量之间制作球拍计数表

我一直在尝试在Racket中创建一个计数为(MakeList a b)的函数,然后显示一个列表,这样(a,a+1,a+2,…,b)。我一直在尝试,但是在网上找到了一些关于如何创建一个列表,然后添加到列表中的内容,但是没有得到什么有用的信息。关于如何创建此函数的任何帮助都将非常棒。我知道这很可能是一个家庭作业问题。正如@AlexisKing指出的,范围函数已经存在。但是如果你坚持自己写这篇文章,我想提供一些帮助。球拍是一种非常有趣的语言,我不想让你感到气馁 从好的方面来看,听起来你基本上知道你需要

Functional programming 在racket中检查列表中是否有大写或小写字母或数字

如何创建用于检查的函数 如果列表在racket中至少有一个大写或小写字母(列表中可能包含数字) 并且不包含特殊字符(无空格,无特殊字符) [0-9]*表示:零个或多个(*)数字([0-9]) [a-zA-Z]+表示:至少一个或多个(+)字母大写或小写([a-zA-Z]) [0-9]*后面可能跟零个或多个数字 ()+整个结构至少匹配一次,如果不是更多次的话 ^$确保此内容从字符串的开头到结尾都匹配,并且没有间隙。 因此,任何不能使用此模式构建的其他字符串都将返回#f。 (任何包含字符串的非字母数

  1    2   3   4   5   6  ... 下一页 最后一页 共 21 页