标签: parametric-polymorphism

是一个函数,用于解决Typed Racket中可键入的函数列表的第一个参数?

我可以在无类型的Racket中编写一个简单的函数,curry-all它接受一个函数列表,所有这些函数都接受第一个参数的相同类型的值,并生成一个函数列表,其第一个参数是curried.

(define (curry-all fs arg)
  (map (? (f) (curry f arg)) fs))
Run Code Online (Sandbox Code Playgroud)

有关上述函数的运行示例,请参阅pasterack上的此代码段.

这是一个有效的函数,但我不确定是否甚至可以输入Typed Racket给出其多态类型构造.curry它本身的类型已经相当复杂,显然其类型curry-all必然更复杂.

我做了一个相对简单的尝试来输入这个函数,虽然我很清楚它不会像我喜欢的那样起作用:

(: curry-all
   (All [a c b ...]
        (Listof (-> a b ... b c)) a
     -> (Listof (-> b ... b c))))
(define (curry-all fs arg)
  (map (? ([f : (-> a b ... b c)])
         (curry f arg))
       fs))
Run Code Online (Sandbox Code Playgroud)

显然,如果所有函数都具有相同的类型(这并非毫无价值!),则可以正常工作,但如果它们具有不同的arities,即使它们的第一个参数的类型是共享的,它也会失败.

有没有办法指定这个函数的类型,以便它可以在更一般的情况下工作?

scheme types racket parametric-polymorphism typed-racket

10
推荐指数
0
解决办法
274
查看次数

什么是C++中的Parametric和Inclusion多态性

我正在地址https://cs.senecac.on.ca/~chris.szalwinski/archives/btp200.082/content/adhoc.html上阅读一些C++文本.

在该部分中UNIVERSAL POLYMORPHISM,作者提到了ParametricInclusion多态性.我不太清楚我是否理解这一点,特别是为什么Parametric在编译时Inclusion实现多态性而多态性是在运行时实现的?

请问有人给我一个明确的解释或一个例子吗?

c++ inclusion parametric-polymorphism

9
推荐指数
1
解决办法
1728
查看次数

为什么列表推导在Haskell中没有错误地接受混合的`[Char]`和`[[Char]]`?

在学习Haskell的过程中,我发现了令我困惑的事情.

我不明白为什么这段代码有效:

Prelude> [y | y <- "a", y <- ["a"]]
["a"]
Run Code Online (Sandbox Code Playgroud)

我试图改为显式[Char]并获得相同的结果(这是有道理的):

Prelude> [y | y <- ['a'], y <- ["a"]]
["a"]
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,这也是有效的:

Prelude> [y | y <- "a", y <- [["a"]]]
[["a"]]
Run Code Online (Sandbox Code Playgroud)

[编辑]给出的错误与同一事实无关:

相反,这正如我所期望的那样无效:

Prelude> [y | y <- 'a', y <- ['a']]
<interactive>:12:11: error:
* Couldn't match expected type `[t0]' with actual type `Char'
* In the expression: 'a'
  In a stmt of a list comprehension: y <- 'a'
  In the expression: [y | y …
Run Code Online (Sandbox Code Playgroud)

polymorphism haskell types list-comprehension parametric-polymorphism

9
推荐指数
1
解决办法
144
查看次数

使用OCaml中的"constraint"关键字可以做些什么

OCaml手册描述了"约束"关键字,该关键字可用于类型定义.但是,我无法弄清楚使用此关键字可以实现的任何用法.这个关键字什么时候有用?它可以用于删除多态类型变量吗?(这样一个模型中的'at变为t,模块可以用在一个functor参数中,它需要t而没有变量.)

ocaml typing parametric-polymorphism

8
推荐指数
1
解决办法
2749
查看次数

输入永远不会有意义的签名

考虑

(a->a) -> [a] -> Bool
Run Code Online (Sandbox Code Playgroud)

这个签名有没有有意义的定义?也就是说,一个不仅仅忽略了这个论点的定义?

x -> [a] -> Bool
Run Code Online (Sandbox Code Playgroud)

似乎有很多这样的签名可以立即排除.

haskell types signature type-signature parametric-polymorphism

8
推荐指数
2
解决办法
269
查看次数

我对Haskell"衍生"的期望是什么?

提前为初学者问题道歉,但我一直在努力寻找有用的信息.我正在努力学习"了解你的Haskell for Great Good",并且我正在尝试理解派生关键字,这似乎是Java的工具,但据说由于类别理论的东西或类似的东西,它可以用很酷的自动代码生成.我声明了一个2向量的数据结构

data R2 = R2 {x :: Double, y :: Double} deriving (Show)
Run Code Online (Sandbox Code Playgroud)

然后我可以用它来做类似的事情

show (R2 1.0 2.0)
Run Code Online (Sandbox Code Playgroud)

现在我想做的是矢量加法和标量乘法,比如

(2.0 * (R2 1.0 2.0)) + (R2 3.0 4.0)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试

Prelude> data R2 = R2 { x :: Double, y :: Double} deriving (Num,Show)
     <interactive>:3:52:
     Can't make a derived instance of `Num R2':
         `Num' is not a derivable class
     In the data declaration for `R2'
Run Code Online (Sandbox Code Playgroud)

所以编译器想出了如何显示原始类型的笛卡尔积,但是加法太难了?也许Num不是正确的派生类型?有多少人可以期望派生一个类型类并在没有额外工作的情况下获得工作代码,比如我不必编写自己的show函数?

非常感谢,

约翰

haskell parametric-polymorphism

8
推荐指数
3
解决办法
250
查看次数

如何在Swift中使用没有type参数的泛型类?

我想在设置泛型类型参数的情况下通用对象封装在另一个类中.我创建了一个基类并从中定义了其他子类.例:Animal<T>

public class Animal<T: YummyObject> {
    // Code
}

public class Dog: Animal<Bark> {
    // Code
}

public class Cat: Animal<Meow> {
    // Code
}
Run Code Online (Sandbox Code Playgroud)

并在下面的扩展名中定义了一个没有 type参数的Animal属性:UITableView

extension UITableView {
    private static var animal: Animal!

    func addAnimal(animal: Animal) {
        UITableView.animal = animal
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这样做时我得到以下编译错误:

对泛型类型的引用Animal需要参数<...>.

这似乎在Java中运行良好.我怎么能在Swift中完成同样的事情呢?

oop generics ios parametric-polymorphism swift

8
推荐指数
1
解决办法
1651
查看次数

哪个是多态类型:一个类型或一组类型?

Hutton在Haskell中编程说:

包含一个或多个类型变量的类型称为多态。

哪个是多态类型:一个类型或一组类型?

用具体类型替换其类型变量的多态类型是类型吗?

用不同具体类型替换其类型变量的多态类型是否被视为相同或不同类型?

polymorphism haskell types parametric-polymorphism

8
推荐指数
2
解决办法
250
查看次数

智能构造函数类型可以有多个有效的 Functor 实例吗?

这两条关于Functors 的规则是众所周知的:

  1. 你不能做一个 Functor如果类型参数以逆变方式出现,
  2. 任何类型最多有一个有效Functor实例

但如果你稍微作弊,你就可以打破第一条规则。以休斯列表为例:

data HList a = UnsafeHList ([a] -> [a])

pattern HList a <- UnsafeHList (($ []) -> a)
    where HList a = UnsafeHList (a ++)

instance Functor HList where
    fmap f (HList a) = HList (map f a)

-- instances necessary to make HList useful, but irrelevant to this example, have been omitted
Run Code Online (Sandbox Code Playgroud)

只要您假设所有HLists 都将通过智能构造函数生成,则该Functor实例是合法的,即使a出现逆变器也是如此。

我的问题:你能用类似的技术来打破第二条规则吗?Functor如果您假设它们总是通过智能构造函数创建,是否有任何类型具有两个不同的有效实例?

constructor haskell functor typeclass parametric-polymorphism

8
推荐指数
1
解决办法
116
查看次数

“forall”如何影响函数签名?

我使用“forall”量词声明了两个函数。其中第一个在签名之前有一个量词,其中包含所有泛型类型参数。第二个使用量词代替每个泛型类型参数的第一个用法。

\n
f :: forall a b c. a -> b -> c -> b -> a\nf a _ _ _ = a\n\ng :: forall a. a ->\n     forall b. b ->\n     forall c. c -> b -> a\ng a _ _ _ = a\n
Run Code Online (Sandbox Code Playgroud)\n

我期望这两个函数是相同的(区别仅在于描述的风格),但以下两个测试告诉我事实并非如此。

\n
w_f :: (forall a b c. a -> b -> c -> b -> a) -> Bool\nw_f _ = True\n\nw_g :: (forall a. a ->\n        forall b. b ->\n        forall c. c …
Run Code Online (Sandbox Code Playgroud)

haskell function signature parametric-polymorphism

8
推荐指数
1
解决办法
240
查看次数