Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 类型的表达式_Function_Haskell_Types - Fatal编程技术网

Function 类型的表达式

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,

我需要找到一个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, 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)