当前位置: 首页 > 知识库问答 >
问题:

如何为类型族编写gcast?

阎扬
2023-03-14
{-# LANGUAGE TypeFamilies #-}
import Data.Typeable

type family T

gcastT :: (Typeable a,Typeable b) => T a -> Maybe (T b)
gcastT = undefined -- but that's not working too well!

一些背景知识,以防我为实际想要实现的目标解决了错误的问题:我的目标是编写一个函数matchandextract:

matchAndExtract :: (Eq a, Typeable a, Eq b, Typeable b) => a -> b -> T b -> Maybe (T a)
matchAndExtract x k v = if (cast x == Just k) then gcastT v else Nothing

它检查xk是否具有相同的类型并相等,然后返回提供的tb(我们当时知道它与ta相同--T可能不是内射的,但它是一个函数!)或nothing,否则。

我已经找到了一个解决办法,将违规的ta包装在newtype中,使用gcast,然后再次打开包装:

matchAndExtractF :: (Eq a, Typeable a, Eq b, Typeable b) => a -> b -> f b -> Maybe (f a)
matchAndExtractF x k v = if (cast x == Just k) then gcast v else Nothing

newtype WrapT a = WrapT { unWrapT :: T a }

matchAndExtractViaWrap :: (Eq a, Typeable a, Eq b, Typeable b) => a -> b -> T b -> Maybe (T a)
matchAndExtractViaWrap x k v = fmap unWrapT $ matchAndExtractF a k (WrapT v)

这种解决方法是完全可以接受的,但我希望去掉虚假的wrapt类型。

共有1个答案

贺经纶
2023-03-14

你要做的事情是不可能的,因为你已经实现了它。相反,您可以使用

type family T x :: *
newtype NT x = NT {fromNT :: T x}
gcastT :: (Typeable a, Typeable b) => NT a -> Maybe (NT b)
gcastT = gcast

在这种情况下,您不需要使用eq约束。

另一个选择是将可键入的词典具体化为GADT

data Type x where
  Typeable :: Typeable x => Type x

asT :: NT x -> Type x -> NT x
asT = const

gcastTD :: Type a -> Type b -> Type a -> Maybe (T b)
gcastTD t@Typeable Typeable x = fmap fromNT $ gcastT $ (NT x) `asT` t
type instance T Int = ()

justUnit = gcastTD (Typeable :: Type Int) (Typeable :: Type Int) ()
 类似资料:
  • 我一直在学习使用Jest库编写JavaScript/TypeScript代码的单元测试。下面是一个我不知道如何处理的例子。它是用TypeScript输入的——只有两个公共方法和一个构造函数需要service1参数。 我想我需要测试两种情况: > 如果 函数为空。我没有在代码中看到它的任何实现,也不知道它是如何工作的。我应该把它作为参数传递给这个类的实例吗? 我很困惑,在这个特定的例子中,我应该使用

  • 下面是我的员工课。如果我在第1行、第2行或第3行编写@bean注释,它会抛出一个错误。 它只允许对方法名使用@bean注释。为什么?

  • 所以我学会了如何在打字稿中进行扩展: 但是如何从中制作一个吸气剂?例如: 所以我可以在代码someArray.lastIndex中调用is作为getter? 我找到了这个答案,但代码无法为泛型类型编译,这样写也很丑陋,但也许我在打字稿中要求太多:如何使用 get 属性扩展打字稿类?

  • 我想写一个小游戏,我可以用W,a,S,D键在JavaFX面板上移动一个球 我有一个和但是我不知道如何编写一个,如果我按D,它将计算。 我必须做什么?

  • 问题内容: 我正在尝试为我的简单类生成hashCode()方法,但是我什么也没用。我将不胜感激任何帮助。我已经实现了equals()方法,该方法如下所示,并且还想知道是否需要实现compareTo()方法。我已经导入了java.lang.Character以使用character.hashCode(),但它似乎不起作用。 提前致谢… 正在给我java.lang.Comparable转换错误的com

  • 有人能给我解释一下如何为下面这样的apex触发器编写测试类吗? 我是Salesforce的新手。有人帮助我如何为上述触发器编写顶点类(测试类)吗? AccountBrowseExtensionTesttestAccountBrowseSystem。DmlException:插入失败。第0行第一个异常;第一个错误:FIELD\u CUSTOM\u VALIDATION\u EXCEPTION,Cit