为什么说我们可以在C编程中用void*实现参数多态?这是不正确的?
教授提出了这个问题而从未回答过.我认为void*实际上是一个非常低级别的被认为是参数多态的东西但是有更强的理由吗?
有企业和人.用户可以喜欢或发布关于商家的评论,但对于一个人来说也不会发生同样的事情.当用户发布有关某个商家或喜欢它的内容时,该商家称之为target喜欢或发布:
trait TargetingRelation[TargetingType[_],TargetedType]
class Business
class Person
class Post[Target | TargetingRelation[Business,Post] ] {
def target:Target
}
class Like[Target | TargetingRelation[Business,Like] ] {
def target:Target
}
Run Code Online (Sandbox Code Playgroud)
在这里,我发明了一种T | P[T]符号意义类型参数T,使其满足某些属性P[T](或者T :|: P[T]如果它具有更多的类型吸引力).代码中的其他地方我想要声明如下:
object canPostAboutBusiness extends TargetingRelation[Post,Business]
object canLikeBusiness extends TargetingRelation[Like,Business]
Run Code Online (Sandbox Code Playgroud)
这些对象实际上是证据,类似于Haskell类型类.所以这会打字检查:
val p = new Post[Business]
val l = new Like[Business]
Run Code Online (Sandbox Code Playgroud)
但不是这个:
val p = new Post[Person]
val l = new Like[Person]
Run Code Online (Sandbox Code Playgroud)
就我对Scala的认识而言,我无法以令人满意的方式对这种特殊情况进行建模.现在我坚持认为这不是子类型,因为商业不是:
class …Run Code Online (Sandbox Code Playgroud) generics scala typeclass parametric-polymorphism type-constructor
有什么区别
def drop1[A](l: List[A]) = l.tail
Run Code Online (Sandbox Code Playgroud)
和
def drop1(l: List[Int]) = l.tail
Run Code Online (Sandbox Code Playgroud)
如果用法看起来像
drop1(List(1,2,3))
Run Code Online (Sandbox Code Playgroud)
?
应该何时使用其中一个,为什么?虽然我能理解第二个例子,但我并不真正理解第一个例子的目的.
似乎我需要明确说明forall在数据定义中有一个参数类型.例如,这个
data A = A (forall s. ST s (STUArray s Int Int))
Run Code Online (Sandbox Code Playgroud)
这将是有效的
data A = A (ST s (STUArray s Int Int))
Run Code Online (Sandbox Code Playgroud)
惯于.
也许我问的是一些太明显的东西,但我不明白这个原因,因为在大多数其他情况下你不需要明确forall指定一个参数类型; 编译器会这样做.那么这里的区别是什么?
我在理解不同类型的多态性时遇到了问题,特别是在OCaml方面.我知道多态性允许OCaml中的多个类型表示为'a,但我不明白不同类型的多态是什么.
如果有人可以用相对较低级别的语言给我一个解释,那就太棒了!ad hoc,参数,包含/子类型
polymorphism ocaml parametric-polymorphism adhoc-polymorphism
有没有办法将作为参数传递的函数应用于两种不同的类型?作为一个人为的例子,我可以(Maybe Int, Maybe Bool)用表达式创建一个(Just 3, Just True),但是如果我尝试使这个行为更通用的功能
generic :: (a -> Maybe a) -> (Maybe Int, Maybe Bool)
generic f = (f 3, f True)
Run Code Online (Sandbox Code Playgroud)
所以我可以做类似的事情generic Just,编译器抱怨因为类型变量a是常量.
其用例是将通用函数应用于树结构,其中每个节点按类型进行参数化.
我有两种数据类型,并希望编写一个返回这些数据类型数据的类:
data D1 a = Da1 a | Db1 a
data D2 a = Da2 a | Db2 a
class D a where
extract :: ??? a -> a
instance D (D1 a) where
extract (Da1 a) = a
extract (Db1 a) = a
instance D (D2 a) where
extract (Da2 a) = a
extract (Db2 a) = a
Run Code Online (Sandbox Code Playgroud)
如果我只有一个类型D1或D2,我可以在类型签名中命名,但在有多种可能性的情况下我该怎么办?这甚至可能吗?
polymorphism haskell types type-signature parametric-polymorphism
我是Haskell的新手,看一个使用函数应用程序的简单例子$.
它似乎很简单 - 它需要一个函数并将其应用于一个值.
所以这是有道理的:
> (+3) $ 2
5
Run Code Online (Sandbox Code Playgroud)
这也是有道理的:
> ($) (+3) 2
5
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为第一个参数是函数,第二个参数是值.
现在考虑使用$创建部分功能.
查看类型,这是有道理的 - 它只需要一个Num类型值b:
> :t ($) (+3)
($) (+3) :: Num b => b -> b
Run Code Online (Sandbox Code Playgroud)
但是这里我迷路了 - 这里发生了什么?:
> :t ($) (2)
($) (2) :: Num (a -> b) => a -> b
Run Code Online (Sandbox Code Playgroud)
我原以为第一个参数需要是一个函数,而不是一个简单的Num值.
所以这是我的问题:
Num (a -> b)语法是什么意思?($)以这种方式使用的例子是什么($) (2)?谢谢!
polymorphism haskell types partial-application parametric-polymorphism
我正在自学榆木,并且看到(当然)有很多关于Html msg-
我知道这是一个“参数化类型”,也就是说,(据我所知),该类型的构造函数Html需要一个参数- 与之类似List Char。
好。但是随后在一些教程中,我看到他们迅速将其更改msg为自定义类型,通常是这样的(我是从内存中这样做的,所以请原谅我):
Html Msg
Run Code Online (Sandbox Code Playgroud)
在哪里Msg可以定义为
type Msg =
Something | SomethingElse
Run Code Online (Sandbox Code Playgroud)
我还在这里看到-https: //discourse.elm-lang.org/t/html-msg-vs-html-msg/2758-他们说
小写的味精称为类型变量。大写的Msg称为具体类型-您的应用程序已定义的类型。
那部分地回答了我的问题,但是有人可以详细说明这到底意味着什么吗?因为当我看到类似的内容时List String,我了解了String这种情况下的msg含义,但是却不了解含义Html msg。
另外,我们是否不更改函数返回值的类型?也就是说,如果Elm运行时期望view返回某个类型,并且该类型为Html msg,如果我们将返回类型更改为Html Whatever,为什么这样做有效?(例如,我们不能在函数的返回值从List String以List Number随意,对吧?)
来自OOP的背景以及诸如C,TypeScript等类型语言的背景,我认为任何东西Msg都需要以某种方式与关联msg,即以某种方式“扩展”它以允许多态。显然,我在看这种错误的方式,任何解释都将不胜感激!