Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Haskell中表示Java Swing包容层次结构

在Haskell中表示Java Swing包容层次结构
EN

Code Review用户
提问于 2012-05-12 01:55:44
回答 1查看 181关注 0票数 6

Java桌面应用程序通过RPC公开其Swing GUI的类/包含层次结构。我正在构建一个连接到应用程序的Haskell客户端。目标是能够在Haskell端的数据结构上执行诸如“查找所有宽度小于w,位于屏幕矩形r内的按钮”之类的查询。

我不知道如何最好地表示结构,特别是在继承/子类型方面。我试过两种方法。第一项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data Component = Component
    {
        componentId::Int,
        pos::(Int,Int),
        dim::(Int,Int),
        componentType::ComponentType,
        children::[Component]
    }

data ComponentType =
     ButtonComponent Button
     -- other component types here
    |OtherComponent

data Button = Button
    {
        buttonText::Text
        -- other button attributes here
    }

我还在考虑使用存在型类型的第二解,以及可键入的实现“下传”的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data Component = Component
    {
        componentId::Int,
        pos::(Int,Int),
        dim::(Int,Int),        
        children::[AnyComponent]
    } deriving Typeable

data AnyComponent = forall a . ( Typeable a, HasComponent a ) => AnyComponent a 

class HasComponent a where
    base :: a -> Component
    downcast :: Typeable b => a -> Maybe b

instance HasComponent Component where
    base = id       
    downcast = cast      -- cast function is from Data.Typeable

instance HasComponent AnyComponent where
    base (AnyComponent a) = base a
    downcast (AnyComponent a) = cast a

data Button = Button 
    {
       buttonComponent:: Component,   -- pointer to "superclass" info
       buttonText::Text
       -- other button attributes here
    } deriving Typeable

instance HasComponent Button where
    base = buttonComponent
    downcast = cast 

什么样的解决方案才是更地道的Haskell?有没有更好的解决办法?

EN

回答 1

Code Review用户

回答已采纳

发布于 2013-04-09 05:09:26

编辑:用Haskell忠实地表示OO语义目前是不可能的。特别是,方法解析可以通过类型类和实例来模拟(但不是很容易,也不是很忠实)。这个非常丰富地介绍了当前的最佳实践,以及未来可能的发展。

这里有一种可能,类似于您的第一个解决方案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data ComponentClass a
    = ComponentClass {
        ...
        , comSubclass :: a
        ...
        }
type Component = ComponentClass ()

data ButtonClass a
    = ButtonClass {
        , buttonText :: Text
        , btSubclass :: a
        ...
        }
type Button = ComponentClass (ButtonClass ())

如果我认为一个简单的层次很适合我的问题域(但不一定要在另一种语言中反映OO ),我就会这么做。但是,如果需要跟踪深度层次结构或多个超类(如Python),则此策略不能很好地工作。

另一个缺点是,您不能将任意ComponentClass a解构为它的子类型a。只有事先知道a的类型,才能做到这一点。但是,您可以使用动态类型来解决这个问题,例如通过Typable

请注意,您还可以在向上的方向表示等级:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data ButtonClass a
    = ButtonClass {
          btText :: Text
        , btSuperClass :: a
        }
type Button = ButtonClass ComponentClass

然后,您可以“向下类层次结构”构建每个对象,直到您发现最具体的类型来封装它。

还请注意,Gtk2Hs使用类似于第二种策略的类型化策略来表示Gtk的类层次。也许看一看它的源代码会很有说服力,甚至只是浏览它的文件上的黑客。

最后,用Exception实现的GHC等级非常有趣,尽管我不认为它对你的帮助不如上面的任何一个

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

https://codereview.stackexchange.com/questions/11715

复制
相关文章
镗刀在加工中出现颤振的主要原因分析
镗刀是采用的数显读数屏的精密镗头,在使用精镗刀加工时,也会出现不同的问题。加工中心镗孔时由于切屑的流出方向在不断地改变,所以刀尖、工件的冷却以及切屑的排出都要比车床加工时难的多。特别是用卧式加工中心进行钢的盲孔粗镗加工时,尤为困难。镗孔加工时最常出现的、也是最令人头疼的问题是颤振。今天我们来分析下镗刀发生颤振的主要原因有哪些:
lrglu
2022/05/16
2.6K0
镗刀在加工中出现颤振的主要原因分析
案例:数控机床主轴校准与颤振监测系统
提高生产数量与产品质量始终是制造业努力追求的目标,工业4.0更勾勒出智能制造的美好愿景,促使被制造业视为是重要生产设备的CNC工具机(数控机床)也得因应这样的趋势不断地精益求精。而数控机床制造商在积极改善自家机器性能并提升加工精度以符合客户需求的过程中,机器校准正确与否是影响加工精度的重要因素之一。但一直以来制造业都是靠累积多年经验的老师傅来进行机器校准,工厂每日必须先以这种传统作法来检查设备才能正式开工;如果该厂需要制造的产品种类较多,每一次产线调整时还得再次为机器重新设定与校准。如此不科学的作业模式既繁琐又费时,一旦作业程序有所疏失就会发生加工精度失准的问题。
SHOUT
2022/05/31
2.9K0
案例:数控机床主轴校准与颤振监测系统
在ListView中实现排序
ListView触发数据源排序,使用数据源(即List<T>)的Sort()方法,又一次绑定数据源到ListView。
全栈程序员站长
2022/09/06
1.3K0
在 Android 12 中构建更现代的应用 Widget
从 2008 年开始,Widget 就一直是 Android 系统的一个重要组成部分,也是自定义主屏幕的一个重要方面。您可以将 Widget 理解为一个 "一目了然" 的应用视图,让用户在无需从主屏幕打开应用的前提下,就能对应用数据和核心功能一览无余。但是从 Android 推出至今,AppWidget 的 API 基本就没有什么大的变化,从 2012 年到 2021 年更是只有一个 Android 版本包含了对 AppWidget API 的更新。而随着 Android 12 的推出,也带来了 Widget API 一些亟需改进的更新。
Android 开发者
2022/03/25
2.2K0
在 Android 12 中构建更现代的应用 Widget
尴尬:在zoom中找不到会议密码
临时要开一个zoom会议,点击“新会议”进入,然后邀请其他与会者。 “会议” - “复制邀请链接”, 得到一行这样的信息(会议号已模糊处理) https://oracle.zoom.us/j/99
Alfred Zhao
2022/10/31
2.8K0
MCM数控机床切削颤振监测与大数据分析系统构建(一)
在金属切削加工过程中,刀具与工件之间剧烈的自激振动通常被称为“颤振”。机床颤振会使加工过程变得不稳定,造成加工表面质量和金属切削率的下降,引起加工工件的表面精度和光洁度下降,降低刀具使用寿命和生产率,严重时甚至会破坏刀具和机床。因此,颤振成为提高机床加工能力的最主要障碍。
SHOUT
2022/05/31
2.7K0
MCM数控机床切削颤振监测与大数据分析系统构建(一)
【Flutter 15】图解 ListView 不同样式 item 及 Widget 显隐性
一年一度的谷歌大会又开始了,谷歌对 Flutter 的投入力度又加大了,所以更得好好学 Flutter 了。和尚在做新闻列表方面的 Demo 时,想到会在列表中展示多种不同 item 样式,今天特意借助上一篇关于 ListView 的小例子 稍微调整一下,测试 ListView 中多种 item 样式展示方式。
阿策小和尚
2019/08/12
2.8K0
【Flutter 15】图解 ListView 不同样式 item 及 Widget 显隐性
listview优化(中)
1,对Imageview使用setTag()方法来解决图片错位问题,这个Tag中设置的是图片的url,然后在加载的时候取得这个url和要加载那position中的url对比,如果不相同就加载,相同就是复用以前的就不加载了 2,对于要加载的图片资源,先在内存缓存中找(原始的方法是使用SoftRefrence,最新的方法是使用android提供的Lrucache),如果找不到,则在本地缓存(可以使用DiskLrucache类)中找(也就是读取原先下载过的本地图片),还找不到,就开启异步线程去下载图片,下载以
xiangzhihong
2018/01/30
1.1K0
Mybatis在IDEA中找不到mapper映射文件
这个问题的解决方法就是在pom.xml文件中加上配置,让编译器把src/main/java目录下的xml文件一同编译到classes文件夹下。
别先生
2020/12/09
3.6K0
flutter中Widget 渲染过程
然后,通过Element树构建RenderObject对象;并将RenderObject对象挂载到Element树上。
挥刀北上
2021/01/05
9990
flutter中Widget 渲染过程
"org.jacoco.agent.rt" 在 maven 中找不到
看起来没有,不提供源码 https://github.com/jacoco/jacoco/issues/207
JavaEdge
2021/02/22
1.6K0
"org.jacoco.agent.rt" 在 maven 中找不到
解决问题:在Linux中找不到wget命令
Linux作为一个广泛使用的操作系统,被广泛用于服务器和开发环境。在Linux上执行命令是日常工作中的常见任务,然而,有时候可能会遇到一些问题。本文将重点解决一个常见问题:在Linux系统中找不到wget命令。我们将通过参考howtouselinux.com上的相关文章来解决这个问题,并提供详细的解决方法和示例。
用户10665603
2023/07/31
1.5K0
WPF中ListView排序
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
5160
在 django 中如何自定义 widget(控件)适用于 xadmin
上篇文章介绍了怎么把django自带的admin替换成xadmin,这篇文章介绍下怎么自定义一个django的widget,关于widget的使用在django的admin和xadmin中均适用。
the5fire
2019/03/01
2.3K0
Android中动态更新ListView
在使用ListView时,会遇到当ListView列表滑动到最底端时,添加新的列表项的问题,本文通过代码演示如何动态的添加新的列表项到ListView中。 实现步骤:调用ListView的setOnScrollListener()方法设置滑动监听器,实现OnScrollListener接口的方法,判断当列表滑动到最低端时,加载新的列表项。 其中OnScrollListener接口需要实现如下两个方法: onScroll(AbsListView view, int firstVisibleItem, int
欢醉
2018/01/22
2K0
Widget模式
Widget模式是指借用Web Widget思想将页面分解成组件,针对部件开发,最终组合成完整的页面,Web Widget指的是一块可以在任意页面中执行的代码块,Widget模式不属于一般定义的23种设计模式的范畴,而通常将其看作广义上的架构型设计模式。
WindRunnerMax
2021/01/14
1.1K0
车床震颤的原因及排除
如果您的刀具过度磨损,切削产生的切削力将会增加。这些增加的切削力会导致切削过程中出现颤动。
lrglu
2023/09/19
1.1K0
车床震颤的原因及排除
android中ListView的用法[通俗易懂]
地址:https://www.cnblogs.com/s-y-j/p/6548032.html
全栈程序员站长
2022/09/06
9610
android中ListView的用法[通俗易懂]
ListView使用技巧-更新中
虽然在Android5.X中,RecyclerView在很多地方组件取代了ListView,但是ListView的使用依然是分广泛。
小小工匠
2021/08/16
9610
点击加载更多

相似问题

颤振ListView.builder在<Widget>[]

12

颤振ListView和列表Widget

21

在颤振中将Widget置于ListView之上

10

颤振: ListView中动态大小的Widget

12

颤振: Stack Widget中的Listview Builder水平

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文