【发布时间】:2019-06-02 12:06:06
【问题描述】:
我需要找到一个 Haskell 函数的表达式。 函数:test :: (c,b,c) -> (b,c,b)
我的代码当然不起作用,因为存在“'c' 的定义冲突”。
test (c,b,c) = (b, c, b)
【问题讨论】:
-
您不能在一个模式中两次提及 same 变量。如果你的元组包含
(1, 'a', 2),会发生什么?这里的“两个 c”是完全不同的。 -
不要将类型变量与模式混淆。
-
有两种可能性:
test (a,b,_) = (b,a,b)和test (_,b,c) = (b,c,b),因为对未知类型的值唯一明智的做法就是将它们从输入复制到输出。进一步限制类型开辟了更多可能性,例如test :: Monoid c => (c,b,c) -> (b,c,b)也允许test (a,b,c) = (b,a<>c,b)和test (a,b,c) = (b,c<>a,b)。 -
我必须找到一个表达式,它的通用类型是给定的函数测试之一。编辑:测试(a,b,_)=(b,a,b)不起作用,它不是(a,b,a)类型->(b,a,b)。不允许使用 Monoid。我必须使用给定的功能。它可以与 let 一起使用吗?
-
@Kabauter,
test (a,b,_) = (b,a,b)的类型比您指定的更通用。但是如果你真的给它你指定的类型签名,它会编译并拥有你想要的类型。