Это невозможно;вы не можете сравнивать функции друг с другом, поэтому нет способа проверить, является ли ваш аргумент a
, b
, c
или чем-то еще.
Действительно, для Haskell было бы невозможнодавайте проверим, одинаковы ли две функции: поскольку Haskell является ссылочно прозрачным, замена двух разных реализаций одной и той же функции не должна иметь никакого эффекта.То есть, до тех пор, пока вы даете один и тот же вход для каждого выхода, точная реализация функции не должна иметь значения, и хотя доказать, что \x -> x+x
и \x -> x*2
- это одна и та же функция, легко, это неразрешимо вgeneral .
Кроме того, нет никакого возможного типа, который a
мог бы иметь, если бы он принимал себя в качестве аргумента (конечно, id id
типов, но id
может принимать что угодно в качестве первого аргумента - это означает, что он не может исследовать это так, как вы хотите).
Если вы пытаетесь достичь чего-то с этим (вместо того, чтобы просто играть с ним из любопытства -это нормально, конечно), тогда вам придется сделать это другим способом.Трудно сказать, каким именно образом это было бы без конкретных деталей.