如何创建返回函数的Haskell函数?

Rog*_*llo 1 haskell functional-programming function function-composition higher-order-functions

我想创建三个Haskell函数:a,b,和c.

每个函数都有一个参数.这个论点是三个函数之一.

我想函数a有这种行为:

  • 如果参数是函数,a则返回函数a.
  • 如果参数是函数b,则返回函数b.
  • 如果参数是函数c,则返回函数a.

这里是我想要的功能回顾a:

a a = a
a b = c
a c = a 
Run Code Online (Sandbox Code Playgroud)

这是我希望其他两个功能的行为:

b a = a
b b = a
b c = c

c a = c
c b = b
c c = c
Run Code Online (Sandbox Code Playgroud)

一旦创建,我希望能够以各种方式组合函数,例如:

  a (c b)
= a (b)
= c
Run Code Online (Sandbox Code Playgroud)

我该如何创建这些功能?

luq*_*qui 16

由于您没有给出如何观察结果a = b = c = id的标准,因此满足您的标准.但当然这不是你想要的.但这个想法很重要:它不仅仅关乎你希望你的函数有什么行为,而是你将如何观察这种行为.

如果你在表示法中允许一些自由,那么有一个最通用的模型,你可以通过使用代数数据类型得到这个:

data F = A | B | C
    deriving (Eq, Show) -- ability to compare for equality and print

infixl 1 % 
(%) :: F -> F -> F
A % A = A
A % B = C
A % C = A
B % A = A
...
Run Code Online (Sandbox Code Playgroud)

等等.a b你不得不说A % B,而不是说,但这是唯一的区别.你可以撰写它们:

  A % (C % B)
= A % B
= B
Run Code Online (Sandbox Code Playgroud)

并且您可以通过部分应用将它们转换为函数(%):

a :: F -> F
a = (A %)
Run Code Online (Sandbox Code Playgroud)

但你无法比较这一点a,正如ehird所说.这个模型等同于你指定的模型,它看起来有点不同.

  • 你可以比较'a`就好了:`实例Eq(F - > F)其中f == g = all(\ x - > fx == gx)[A,B,C]` (4认同)

ehi*_*ird 11

这是不可能的; 你不能比较的功能给对方,所以没有办法来检查,如果你的说法是a,b,c或别的东西.

实际上,Haskell不可能让你检查两个函数是否相同:因为Haskell是引用透明的,所以替换相同函数的两个不同实现应该没有效果.也就是说,只要你为每个输出提供相同的输入,函数的确切实现应该无关紧要,虽然证明\x -> x+x并且\x -> x*2相同的函数很容易,但它通常不可判定的.

另外,没有可能的类型,a如果它将自己作为一个参数(当然,id id类型,但id可以采取任何作为它的第一个参数 - 这意味着它不能以你想要的方式检查它).

如果你想用这个来实现某些目标(而不仅仅是出于好奇而玩它 - 当然这很好),那么你将不得不以其他方式做到这一点.如果没有具体的细节,很难准确地说出会是什么样的方式.