R中函数调用参数值的haskell样式模式匹配

R中函数调用参数值的haskell样式模式匹配,r,haskell,pattern-matching,R,Haskell,Pattern Matching,在R中,是否可以基于参数值ala Haskell进行函数模式匹配 i、 e.如果参数x为'foo',运行函数的一个版本,如果x为'bar',运行另一个版本?显然,如果必要的话,可以使用if语句来实现,但我想知道是否有一种更“功能性”的方法 例如,要自动执行此类函数选择(foo1与foo2),而无需使用ifelse语句进行条件处理: foo1 <- function(a) { paste0(a, 'foo1') } foo2 <- function(a) { past

在R中,是否可以基于参数值ala Haskell进行函数模式匹配

i、 e.如果参数x为'foo',运行函数的一个版本,如果x为'bar',运行另一个版本?显然,如果必要的话,可以使用if语句来实现,但我想知道是否有一种更“功能性”的方法

例如,要自动执行此类函数选择(foo1与foo2),而无需使用ifelse语句进行条件处理:

foo1 <- function(a) {
    paste0(a, 'foo1')
}

foo2 <- function(a) {
    paste0('baz', a, 'foo2')
}

x <- 'barp'
value <- ifelse(x == 'barp', foo1(x), foo2(x))

foo1这可以基于对象的“类”而不是值来完成。我对Haskell不太熟悉,但我认为Haskell也会发送类/类型,而不是实际值?以下是R的实现:

> foo <- function(a) UseMethod("foo")
> foo.1 <- function(a) paste(a, 'foo1')
> foo.2 <- function(a) paste('baz', a, 'foo2')
> 
> obj_1 <- structure("hello world", class="1")
> obj_2 <- structure("hello world", class="2")
> 
> foo(obj_1)
[1] "hello world foo1"
> foo(obj_2)
[1] "baz hello world foo2"
>foo foo.1 foo.2
>obj_1 obj_2
>foo(obj_1)
[1] “你好,世界美食1”
>foo(obj_2)
[1] “baz hello world foo2”

这将仅基于第一个参数的类进行分派。如果要基于多个参数分派,可以使用S4方法。

对于一般代数数据类型,可以定义自己的匹配函数帮助程序。这些有时被称为“消除器”,本质上是将ADT值转换为教会编码

例如,让我们翻译Haskell代码snipppet:

x=3
y=没有
a=无任何情况下的情况x->42;只需w->w+100
b=无的情况y->42;只需w->w+100
结果是:

#消除器

Match为什么不这样呢?关键是在haskell中,它可以是一个处理两种情况的函数,根据参数值分派一个或另一个。另外,我正在寻找Haskell的R等价物,而不是Haskell代码。我发现它似乎扩展了R以添加有限形式的模式匹配。有一个名为lambda.R的包,我认为它解决了模式匹配和guards.Haskell可以根据值进行模式匹配。这是一种语言习惯用法,例如,我必须承认我不熟悉教会编码。这似乎有点复杂,但我想尝试实现模式匹配在某种程度上是在与语言“斗争”。