首页 > 解决方案 > 类型的表达式

问题描述

我需要找到一个 Haskell 函数的表达式。函数:测试 :: (c,b,c) -> (b,c,b)

我的代码当然不起作用,因为有“'c' 的定义冲突”。

test (c,b,c) = (b, c, b)

标签: functionhaskelltypes

解决方案


如评论中所述,如果您愿意

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,因为这是您拥有的唯一适当类型的值。第二个值可以是第一个或第三个原始值。

当然,如果您允许bottom,那么您可以编写大量无意义的函数。

test (a, b, c) = test (c, b, a)
test _ = undefined
test _ = error "Yup, this is definitely a tuple"
test (_, b, c) = (b, c, undefined)

这些都不是非常有意义,但它们会进行类型检查。但是,出于所有实际目的,只有两个非底部示例是有趣的。


推荐阅读