相关疑难解决方法(0)

(ML)模块vs(Haskell)类型类

根据Harper(https://existentialtype.wordpress.com/2011/04/16/modules-matter-most/),似乎Type Classes根本没有提供与Modules提供的相同级别的抽象,而我正在拥有很难确切地弄清楚原因.并且在该链接中没有示例,因此我很难看到关键差异.还有其他关于如何在模块和类型类之间进行翻译的论文(http://www.cse.unsw.edu.au/~chak/papers/modules-classes.pdf),但这对于从程序员的角度来看实现(它只是说没有人可以做的事情,另一个人无法模仿).

具体来说,在第一个链接中:

首先,他们坚持认为类型可以完全以一种方式实现类型类.例如,根据类型类的哲学,整数可以以一种方式(通常的顺序)排序,但显然有许多有趣的排序(例如,通过可分性).第二个问题是它们混淆了两个不同的问题:指定类型如何实现类型类,以及指定在类型推断期间何时应该使用这样的规范.

我也不明白.一个类型可以在ML中以多种方式实现类型类?如果不创建新类型,您将如何通过示例按可分性排序整数?在Haskell中,您必须执行诸如使用数据之类的操作,并instance Ord提供替代排序.

第二个,不是两个在Haskell中是截然不同的吗?指定"何时应在类型推断期间使用此类规范"可以通过以下方式完成:

blah :: BlahType b => ...
Run Code Online (Sandbox Code Playgroud)

其中BlahType是在类型推断期间使用的类而不是实现类.然而,"类型如何实现类型类"是使用完成的instance.

有人可以解释链接真正想说的内容吗?我只是不太明白为什么模块比Type Classes更少限制.

haskell ml sml

22
推荐指数
1
解决办法
3290
查看次数

将Dict转变为约束

我有一个类Cyc c r,它具有表单数据的功能c m r,其中m是一个幻像类型.例如,

class Cyc c r where
  cyc :: (Foo m, Foo m') => c m r -> c m' r
Run Code Online (Sandbox Code Playgroud)

我没有做出m类参数的充分理由.出于此示例的目的,主要原因是它减少了对函数的约束数量.在我的实际例子中,对这个界面更迫切的需求是我使用更改和隐藏的幻像类型,所以这个界面让我得到Cyc任何幻像类型的约束.

这个选择的一个缺点是我不能制作Num (c m r)超类约束Cyc.我的意图是c m r应该Num随时随地(Cyc c r, Foo m).目前的解决方案非常烦人:我在课堂上添加了方法Cyc

witNum :: (Foo m) => c m r -> Dict (Num (c m r))
Run Code Online (Sandbox Code Playgroud)

哪种方式完成同样的事情.现在,当我有一个带有泛型Cyc并需要Num (c m r)约束的函数时,我可以写:

foo :: …
Run Code Online (Sandbox Code Playgroud)

haskell ghc

15
推荐指数
1
解决办法
249
查看次数

多态参数类型的模式匹配 - 替代方案

假设我需要不同的输出,具体取决于函数的多态参数的类型.我的初始尝试失败了一些神秘的错误消息:

choice :: a -> Int
choice (_ :: Int) = 0
choice (_ :: String) = 1
choice _ = 2
Run Code Online (Sandbox Code Playgroud)

但是,我们可以通过将所需类型包装在不同的数据构造函数中并在模式匹配中使用它们来轻松解决这个问题:

data Choice a = IntChoice Int | StringChoice String | OtherChoice a

choice :: Choice a -> Int
choice (IntChoice _) = 0
choice (StringChoice _) = 1
choice (OtherChoice _) = 2
Run Code Online (Sandbox Code Playgroud)

问题:你知道如何绕过这个吗?Haskell2010,GHC或任何扩展中是否有一个功能允许我使用第一个变体(或类似的东西)?

haskell pattern-matching polymorphic-functions

2
推荐指数
1
解决办法
602
查看次数

标签 统计

haskell ×3

ghc ×1

ml ×1

pattern-matching ×1

polymorphic-functions ×1

sml ×1