首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell:类型转换

Haskell:类型转换
EN

Stack Overflow用户
提问于 2016-03-16 02:12:43
回答 2查看 134关注 0票数 1

对于这些数据:

代码语言:javascript
复制
data A = A
data B = B

class C1 a where repr :: a -> String
instance C1 A where repr _ = "A"
instance C1 B where repr _ = "B"

class C2 a
instance C2 A

有办法用这种类型实现函数吗?

代码语言:javascript
复制
conv :: (C1 a, C2 b) => a -> Maybe b

对于作为C2实例的类型的参数,它应该返回Nothing,对于任何其他类型,它应该返回Nothing

repr是内射的。我可以更改类C2,但是类C1在外部库中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-16 05:14:09

不,这不可能。开放世界假设说,无法(无论是在编译时还是在运行时)显示给定类型不是给定类的实例。

票数 6
EN

Stack Overflow用户

发布于 2016-03-16 02:28:09

为什么要使用C2类型类呢?您可以简单地这样做:

代码语言:javascript
复制
conv :: C1 a => a -> Maybe a
conv a = case repr a of
             "A" -> Just a
             _   -> Nothing

这是在假设repr函数是内射的情况下工作的。

编辑:这里介绍了如何以您想要的方式实现conv函数:

代码语言:javascript
复制
{-# LANGUAGE TypeFamilies #-}

conv :: (C1 a, C2 b, a ~ b) => a -> Maybe b
conv a = case repr a of
             "A" -> Just a
             _   -> Nothing

注意,等式约束a ~ b是必需的。它告诉编译器,类型a和类型b必须是相同的类型。要使用相等约束,我们需要启用TypeFamilies扩展。

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

https://stackoverflow.com/questions/36025660

复制
相关文章

相似问题

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