【问题标题】:Expression for a type [duplicate]类型的表达式[重复]
【发布时间】: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) 的类型比您指定的更通用。但是如果你真的给它你指定的类型签名,它会编译并拥有你想要的类型。

标签: function haskell types


【解决方案1】:

如 cmets 中所述,如果您愿意

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)

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

【讨论】:

  • 我明白了。让我看看我的伙伴们的解决方案。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2020-12-20
  • 2018-05-21
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多