首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell: Existential类型的记录更新

Haskell: Existential类型的记录更新
EN

Stack Overflow用户
提问于 2011-01-03 04:00:29
回答 2查看 717关注 0票数 6

我试图对一个存在记录使用记录更新时遇到了一个错误。用谷歌快速搜索一下,我找到了feature request #2595,上面显示它在6.8.3版本中已经实现。我使用的是6.10.4,所以我认为它应该可以工作,但功能请求中的示例代码:

代码语言:javascript
复制
{-# LANGUAGE ExistentialQuantification,Rank2Types #-}
module Foo where

data Foo = forall a . Foo { foo :: a -> a, bar :: Int }

x :: Foo 
x = Foo { foo = id, bar = 3 } 

f :: Foo -> Foo 
f rec = rec { foo = id }

g :: Foo -> Foo 
g rec = rec { bar = 3 } 

产生与功能请求中抱怨的相同的错误:

代码语言:javascript
复制
test.hs:10:8:
    Record update for the non-Haskell-98 data type `Foo' is not (yet) supported
    Use pattern-matching instead
    In the expression: rec {foo = id}
    In the definition of `f': f rec = rec {foo = id}

test.hs:13:8:
    Record update for the non-Haskell-98 data type `Foo' is not (yet) supported
    Use pattern-matching instead
    In the expression: rec {bar = 3}
    In the definition of `g': g rec = rec {bar = 3}

这是在某个时候故意放弃的功能,还是我应该提交错误报告?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-03 05:00:19

实际上,Trac slip说它是在6.12版本中实现的--这个bug是在6.8.3版本中发现的。因此,您使用的版本比修复版本旧。

此外,修复的changelog条目似乎表明它没有完全修复;您仍然会收到第一个错误,但不是第二个错误。如果问题的其余部分还没有bug报告,我会说继续并提交。

票数 5
EN

Stack Overflow用户

发布于 2011-01-21 22:26:36

还有另一种方法!

如果将数据类型定义从

代码语言:javascript
复制
data Foo = forall a . Foo { foo :: a -> a, bar :: Int }

代码语言:javascript
复制
data Foo = Foo { foo :: forall a . a -> a, bar :: Int }

,则它编译时不会出现错误。--使用ghc-6.12.2.20100531

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4580211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档