Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在JS的函数式编程中执行多实例方法的等效性是什么?_Javascript_Typescript_Functional Programming - Fatal编程技术网

Javascript 在JS的函数式编程中执行多实例方法的等效性是什么?

Javascript 在JS的函数式编程中执行多实例方法的等效性是什么?,javascript,typescript,functional-programming,Javascript,Typescript,Functional Programming,假设我在JS中有一个类,其类型脚本如下: type命令='F'|'B'//向前、向后 班车{ 私人x:号码 二等兵y:号码 构造函数(x:编号,y:编号){ 这个。x=x 这个。y=y } 私人报告职位(){ 返回“(${this.x},${this.y})` } 私人移动(命令:命令){ 如果(命令=='F')此.y++ 如果(命令=='B')此.y-- } 执行(命令:命令){ 此.move(命令) 返回此.reportPosition() } } 当我创建一个Car实例并执行execut

假设我在JS中有一个类,其类型脚本如下:

type命令='F'|'B'//向前、向后
班车{
私人x:号码
二等兵y:号码
构造函数(x:编号,y:编号){
这个。x=x
这个。y=y
}
私人报告职位(){
返回“(${this.x},${this.y})`
}
私人移动(命令:命令){
如果(命令=='F')此.y++
如果(命令=='B')此.y--
}
执行(命令:命令){
此.move(命令)
返回此.reportPosition()
}
}
当我创建一个Car实例并执行
execute
方法时,会发生两件事:

  • 实例的内部状态(x,y)已更新
  • execute
    函数返回一个字符串
现在,我想以一种更灵活的方式编写同样的东西,使函数更纯粹,但我在
execute
函数方面遇到了困难。 我的做法是:

type命令='F'|'B'
车辆类型={
x:号码
y:号码
}
函数createCar(x:number,y:number):Car{
返回{x,y}
}
功能报告位置(车:车){
返回`$({car.x},${car.y})`
}
功能移动(车:车,命令:命令){
如果(命令=='F')返回createCar(car.x+1,car.y)
if(command=='B')返回createCar(car.x-1,car.y)
回程车
}
功能执行(车:车,命令:命令){
const newCar=移动(汽车,命令)
const msg=reportPosition(新车)
返回[新车,味精]
}
我的问题如下:

  • 由于
    execute
    一次执行两件事,我觉得必须在函数中从中返回两个值。但这感觉不对。 这是“有效”的函数式编程吗?或者我永远不会在FP世界中创建这样一个函数,而只是单独调用其中的每个函数(
    move
    reportPosition

  • 如果
    move
    功能还必须返回汽车移动后是否发生碰撞的信息,该怎么办?我是否还需要从修改后的函数返回两个值:newcar实例和一个布尔值(表示撞车)

  • 另外,我在
    move
    函数中使用了
    createCar
    函数,这在技术上不允许用于纯函数,对吗? 解决这个问题的最佳方法是什么?将
    createCar
    函数作为参数传递给
    move

  • 谢谢

  • 同时做两件事并不一定会使函数无效函数编程(我认为“有效”指的是纯函数编程)。在函数式编程中,函数的“纯”是因为它的返回值只由输入值决定,而不由其他值决定。它也不会修改任何外部状态或变量(称为“自由变量”或全局变量,表示未绑定在输入参数中的变量)。您在
    execute
    中所做的事情可以用函数式编程语言简单地表达出来,例如Haskell:
  • execute::Car->Command->(Car,字符串)
    执行汽车指令=让新车=将汽车指令移入(新车,报告定位新车)
    
  • 如果
    move
    必须报告额外的数据,您可以将其包含在返回类型中,并且它将保持纯净。但是,假设“如果汽车撞车”是一个错误状态,那么通常会通过返回一个sum类型来建模(Haskell中的
    可能
    )。以
    Maybe
    为例:
    数据Maybe a=Just a | Nothing
    ,如果汽车撞车,你可以返回
    Nothing
    ,如果它没有返回
    Just position
    ,那么使用
    move
    功能的任何东西都可以验证它没有返回
    Nothing

  • 为什么不允许您在
    move
    内部调用
    createCar
    ?无论是
    move
    还是
    createCar
    都不修改任何外部状态/变量,都只使用其返回中提供的输入


  • 重复我在主要帖子中的评论,我上面提到的Haskell中的很多东西(例如,
    可能
    )都可以在JavaScript/TypeScript库中找到。特别是对于TypeScript,有。有时可能会有点混淆,因为通常有许多名称引用相同的概念。例如,一些库将
    Maybe
    称为
    选项

    js/ts生态系统中有一些FP库试图对函子/单子/半群等进行建模。例如,请参见FP ts。实际上,我甚至没有
    execute
    函数
    move
    返回一个已更改的状态,然后调用方可以在新状态下调用
    reportPosition
    。对于3,我不知道为什么FP不允许这样做。数据输入,数据输出。它没有副作用。我认为他对FP中“纯”的含义有一些误解。根据他的问题,他似乎认为不允许调用其他函数,这样做会使函数变得不纯净,但事实并非如此。1)只要返回某个内容,只要返回相同的输出,就可以返回任何想要的内容。3) 您可以在另一个函数中调用函数,只要它是纯函数,如果被调用方不纯净,调用方也会不纯净。