在haskell中如何做到这一点?

Gmp*_*Gmp 1 erlang haskell

我怎么能在haskell中这样做?

equal(S,S) -> true;
equal(S1, S2) -> {differ, S1, S2}.
Run Code Online (Sandbox Code Playgroud)

C. *_*ann 12

Haskell有一个完全可维护的(==)运算符来检查相等性(对于定义了相等性的类型),所以我假设你除了测试相等性之外还指的是其他东西.

我不知道Erlang,但考虑到你写的equal(S, S)我的第一个猜测是你希望模式匹配通过重用变量名来表达相等性.不幸的是,Haskell(和一般的ML风格)模式匹配不像Prolog那样强大; 所有模式都可以做的是绑定变量,而不是执行完全统一.

确实存在常量值模式,foo [1,2] = ...但这只是绑定和等式检查的语法糖,而且它只针对常量值而不是变量.

通常的Haskell方法可能是模式保护,如下所示:

data EqualResult a b = Yep | Nope (a, b) deriving (Show, Eq)

equal :: (Eq a) => a -> a -> EqualResult a a
equal s1 s2 | s1 == s2  = Yep
            | otherwise = Nope (s1, s2)
Run Code Online (Sandbox Code Playgroud)

如果您想要某种引用相等而不是检查相等的值,那就不行了,因为它在Haskell中甚至没有意义.

编辑:有人向我指出,您可能也一直在询问返回不同的结果类型.在Haskell的任何介绍中都应该很好地使用类型,但在这种情况下的简短版本是,如果你需要返回两种可能类型中的一种,你需要一种数据类型,每种类型都有一个构造函数; 然后使用模式匹配(在声明或case表达式中)检查结果.

在这种情况下,为了使它看起来更像你的函数,我创建了一个带有两个构造函数的特殊用途类型:一个表示相等(没有进一步的细节),另一个表示包含一对值的不等式.您也可以使用内置类型以通用方式执行此操作,该类型Either a b具有两个构造函数Left aRight b.