Function 类型的表达式
我需要找到一个Haskell函数的表达式。 函数:test::(c,b,c)->(b,c,b) 我的代码当然不起作用,因为“c”的定义有冲突Function 类型的表达式,function,haskell,types,Function,Haskell,Types,我需要找到一个Haskell函数的表达式。 函数:test::(c,b,c)->(b,c,b) 我的代码当然不起作用,因为“c”的定义有冲突 如评论中所述,如果您愿意 test :: forall b c. (c, b, c) -> (b, c, b) (forall为强调而添加) 然后,您实际上无法对元组中的值执行任何操作,因为您对它们各自的类型一无所知。因此,该函数仅有两种(非底部)可能的实现是 test (c, b, _) = (b, c, b) -- or test (_, b,
如评论中所述,如果您愿意
test :: forall b c. (c, b, c) -> (b, c, b)
(forall
为强调而添加)
然后,您实际上无法对元组中的值执行任何操作,因为您对它们各自的类型一无所知。因此,该函数仅有两种(非底部)可能的实现是
test (c, b, _) = (b, c, b)
-- or
test (_, b, c) = (b, c, b)
结果元组的第一个和第三个元素只能是b
,因为这是您拥有的唯一适当类型的值。第二个值可以是第一个或第三个原始值
当然,如果您允许,那么您可以编写大量无意义函数
test (a, b, c) = test (c, b, a)
test _ = undefined
test _ = error "Yup, this is definitely a tuple"
test (_, b, c) = (b, c, undefined)
这些都不是很有意义,但它们会进行打字检查。然而,出于所有实际目的,只有两个非底部的示例是有趣的。在一个模式中不能两次提到同一个变量。如果元组包含
(1,'a',2)
,会发生什么情况?这里的“两个c”完全不同。不要将类型变量与模式混淆。有两种可能性:test(a,b,)=(b,a,b)
和test(u,b,c)=(b,c,b)
,因为对于未知类型的值,唯一明智的做法是将它们从输入复制到输出。进一步约束类型会带来更多的可能性,例如test::monoidc=>(c,b,c)->(b,c,b)
允许test(a,b,c)=(b,ac,b)
和test(a,b,c)=(b,ca,b)
。我必须找到一个表达式,该表达式的通用类型是函数测试的给定类型。编辑:测试(a,b,)=(b,a,b)不起作用,它不是类型(a,b,a)->(b,a,b)。不允许使用幺半群。我必须使用给定的函数。它与let一起工作吗?@Kabauter,test(a,b,)=(b,a,b)
的类型比您指定的更通用。但是如果你真的给了它你指定的类型签名,它会编译并拥有你想要的类型。我理解。让我检查一下我同伴的解决方案。
test (a, b, c) = test (c, b, a)
test _ = undefined
test _ = error "Yup, this is definitely a tuple"
test (_, b, c) = (b, c, undefined)