问题标签 [adhoc-polymorphism]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 在临时多态函数和参数多态函数之间转换的好方法
我想知道是否有通用方法可以在临时多态函数和参数多态函数之间进行转换。换句话说,给定一个特殊的多态函数,如何实现它的参数对应?反过来呢?
举sort
个例子。很容易sort :: Ord a => [a] -> [a]
写成sortBy
:
但反过来似乎很棘手,到目前为止,我能做的最好的就是有点“面向对象”:
但这听起来更像是一种技巧,而不是正确的解决方案。
所以我想知道:
- 这个具体例子有更好的方法吗?
- 在临时多态函数和参数函数之间转换的一般技术是什么?
haskell - 为什么 Num 可以像小数一样起作用?
正如预期的那样,这很好用:
这可以按预期工作,因为 everyFractional
也是Num
.
因此,正如预期的那样,我们可以将参数传递给Fractional
参数Num
。
另一方面,以下也有效。我不明白为什么。
出乎意料地工作!有s不是 。Num
Fractionals
那么为什么我可以将参数传递给Num
参数Fractional
呢?你可以解释吗?
haskell - 类型级别的类型类可以用更高级别的类型来模拟吗?
我有一个可插入的运行时类型检查器,它支持参数但没有临时多态性,因为没有编译步骤,并且一旦类型检查器被停用,类型信息就会被删除。
现在我最近想出了用显式类型来具体化类型类的想法,这样我就可以在不必将底层机制完全合并到类型检查器中的情况下获得它们的一些优势:
似乎类型类可以用 rank-2 类型模拟,至少在类型级别,因为当然仍然没有静态调度。
我的假设是否正确,并且由于我是 Haskell 新手,我的显式仿函数类型是否比直接使用有任何优势map
?
scala - Scala中Ad-hoc多态和参数多态的区别
parametric polymorphism
因此,我一直在搜索有关and之间主要区别的文档 adhoc-polymorphism
,但我仍然有一些疑问。
例如,像head
Collections 中的方法,显然是参数多态性,因为用于获取 List[Int] 中的头部的代码与任何其他 List 中的相同。
(不确定这是否是 head 的实际实现,但没关系)
另一方面,类型类被认为是临时多态性。因为我们可以提供不同的实现,限制在类型上。
在中间,我们有像过滤器这样的方法,它们是参数化的,但我们可以通过提供不同的功能来提供不同的实现。
过滤器、映射等方法是否被视为临时多态性?为什么或者为什么不?
polymorphism - 在 ocaml 中定义多态中缀运算符
我需要创建一个运算符-
,给定两个字符串返回第一个字符串减去第二个字符串的所有字符。例如:"abcd"-"ad"="bc"
。
在编写随机代码时,我注意到如果我为-
运算符分配一个新函数,我就不能再将它与整数一起使用。例如:
我想这样做,以便我可以-
在整数和字符串之间使用运算符,这可能在 ocaml 中还是我必须创建一个自定义运算符?
javascript - 如何在没有任何自省的情况下创建一个纯功能的临时多态镜头?
我改编了 DrBoolean 的镜头实现,这样它就可以在没有自省/鸭子打字/依赖原型身份的情况下工作。计算应完全由高阶函数的延续和函数参数确定。我已经走到了这一步:
在这个版本中,函子约束constMap
在镜头构造函数中被硬编码。当view
调用一个镜头时,$$(runConst, fx(Const))
已经传递了正确的类型(),但是为了获得一个临时多态镜头,我也需要传递相应的函子实例。
我已经尝试了最明显的方法$$(runConst, fx(constMap) (Const))
,但是,这会干扰构图。我就是想不通。
operator-overloading - 使运算符 `<` 对自定义类型起作用的方法
我有type 'a edge = {from: 'a; destination: 'a; weight: int}
我想要Printf.printf "%b\n"
( {from= 0; destination= 8; weight= 7}
< {from= 100; destination= 33; weight= -1} )
print true
所以我尝试了这个let ( < ) {weight= wa} {weight= wb} = wa < wb
但在此之后,<
操作员只能在 上工作'a edge
,这意味着1 < 2
会引发错误。
我想这样做的原因如下
我写一棵左倾树
如果我不能<
按预期工作,我必须在使用的地方传入一个比较 lambda<
并替换它。而且我觉得没有吸引力。
typescript - 如何在打字稿中表达混合的临时和参数多态?
我不确定我是否在描述标题中当前的任务。我想问的来自以下要求。
我正在尝试为有限状态机的状态做一个抽象,并提出以下定义(在打字稿中)
我试图表达有限状态机的状态应该能够接受消息并返回新状态,并带有一个可选的回调来处理转换期间的事件。
当将此接口实现为具体状态时,会出现问题。
例如,我正在尝试制作一个只有两种状态的简单状态机,LEFT和RIGHT,并带有三个可能的消息go-on、turn-left、turn-right。下表显示了它们的关系。
关键是我想限制状态LEFT只接受go-on和turn-right消息,而 send turn-left to LEFT预计是编译错误。
我尝试在 typescript 3.4.5 中实现如下。
该实现没有编译错误,并且自动完成按预期工作。但是因为它看起来很奇怪,所以我问了一个问题TypeScript function generic can only work for function overload with more than one signatures。
感谢您在该问题下的友好回复,我了解将重载函数分配给泛型函数是错误的。但是,如何在保持特定状态只接受所需类型的消息的同时表达状态的一般接口呢?
我能想到的另一个抽象是
但是返回类型是递归的,我不知道上面那三个问号要填什么。
一个更简单的版本可能是
除了返回类型中令人讨厌的any之外,它的行为似乎很像。
我在 GitHub 中发现了一个关于 generic value 的可能相关问题。
这个问题定义明确吗?
如果属实,上面列出的这些方法是否有正确的解决方案?
如果为假,正确的解决方案是什么?
haskell - 我什么时候应该通过类型类或其他方式定义多态函数?
我试图弄清楚类型类的目的,如果不使用类型类还有什么。
类型类是定义多态函数的一种方式吗?
类型类是定义多态函数的唯一方法吗?例如:
我可以在不使用 type class 的情况下定义==
and /=
for Bool
(以及任何其他类型)Eq
吗?
如果有任何其他方式,我什么时候应该使用哪种方式来定义多态函数,使用类型类还是使用其他方式?
oop - 接口属于临时多态(即重载)还是子类型多态?
https://wiki.haskell.org/Polymorphism说
Ad-hoc 多态性是指当一个值能够采用多种类型中的任何一种时,因为它或它使用的值已经为每种类型提供了单独的定义。例如,与应用于整数相比,+ 运算符在应用于浮点值时所做的事情本质上是完全不同的——在 Python 中,它甚至可以应用于字符串。大多数语言至少支持一些临时多态性,但在像 C 这样的语言中,它仅限于内置函数和类型。其他语言(如 C++)允许程序员提供自己的重载,提供单个函数的多个定义,以消除参数类型的歧义。在 Haskell 中,这是通过类型类系统实现的和类实例。
尽管名称相似,但 Haskell 的类型类与大多数面向对象语言的类有很大不同。它们与接口有更多的共同点,因为它们通过类型签名指定一系列方法或值,由实例声明实现。
这是否意味着类型类是实现重载的一种方式,即即席多态性?
OO语言(如Java、C#)中的接口属于哪种多态,即组多态(即重载)还是子类型多态?
由于类型类类似于接口,接口是一种实现重载的方法,即特设多态性,就像类型类一样?
接口是否类似于基类,那么接口是实现子类型多态的一种方式,就像类继承一样?
谢谢。