标签: parametric-polymorphism

为什么函数参数在Ocaml中不能是多态的?

如果我有以下功能:

let rejected f = (f 1, f "hi");;
Run Code Online (Sandbox Code Playgroud)

它被类型检查器拒绝,我真的不明白为什么类型检查拒绝它.因为f可以是多态函数(比如说id),类型检查器应该允许它.有人可以解释一下吗?

polymorphism ocaml types parametric-polymorphism

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

我可以在Haskell中约束类型/数据构造函数的参数化多态类型吗?

我有一个参数化类型,我想约束到一个数字类型,更具体地说是一个Fractional,例如:

data Rating a = (Fractional a) => Score a | Unscored deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)

这样API的用户可以定义他们可能使用哪种非整数类型(FloatDouble?),但我写的内部API代码仍然可以对数字类型执行算术运算.我不希望它是一个整数,因为我的"内部操作"的结果可能不是整数,我的理解是使用Fractional会导致更准确的结果.

编译上面(至少在GHCI中)给出了以下错误:

    Data constructor `Score' has existential type variables, a context, or a specialised result type
  Score :: forall a. Fractional a => a -> Rating a
  (Use ExistentialQuantification or GADTs to allow this)
In the definition of data constructor `Score'
In the data declaration for `Rating'
Run Code Online (Sandbox Code Playgroud)

这告诉我,我正在做一些我可能不想继续尝试的事情; 即我的设计是垃圾.

我想我试图在这个API中说出以下内容:"当你使用Rating类型时,它的参数必须是一个子类,Fractional所以我可以对它执行准确的算术".我怎么能实现这个目标?还是我离开了标记和/或过度工程?

haskell types api-design parametric-polymorphism

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

如何在c#中将类类型保存为变量?

在c#中,你可以这样做吗?

type typeOfInt = type(int);
int x = (typeOfInt)1;
Run Code Online (Sandbox Code Playgroud)

基本上我想将一个类型存储为变量,所以我可以将变量用作转换.我试图这样做,因为在我参数多态函数中,变量可以是2种类型中的1种.两种类型都有我想要使用的相同方法,但它不会让我使用它,因为它是一个变量类型.

    public static void SetFolderOrderValue<T>(T item, int value, Report reportObject)
    {
        if (!item.Exists)
        {
            reportObject.Log("The folder \"" + item.Name + "\" does not exist.");
            return;
        }
        try
        {
            item.SetProperty(folderOrderProperty, value);
            item.Update();
        }
        catch (SPException ex)
        {
            reportObject.Log("An error occurred when saving changes to the folder \"" + item.Name + "\". Maybe due to concurrent changes from another user. Please try again after a minute.\n" + Report.GetErrorInfo(ex));
        }
        catch (Exception ex)
        { …
Run Code Online (Sandbox Code Playgroud)

c# parametric-polymorphism

0
推荐指数
1
解决办法
4268
查看次数

多态返回类型

函数从字节流中读取ID.它知道id的大小 - 可以是4或8个字节.如何使返回类型多态?

(伪代码:)

    class (Integral a) => IdSize a where
      size :: a -> Int

    instance IdSize Int32 ...

    instance IdSize Int64 ...

    data Data = Data (Map (IdSize a) String)
    readData :: Data (Map (IdSize a) String)
    readId :: (forall a. IdSize a) => a -- kind of this, but not right
Run Code Online (Sandbox Code Playgroud)

这个readId需要来自调用者的IdSize实例,但调用者不知道大小.类似地,readData返回的Map需要是多态的,但调用者不知道实际的类型.使用Map的函数将知道该类型.

haskell parametric-polymorphism

0
推荐指数
1
解决办法
399
查看次数

我怎样才能使这个功能更优雅

我有这个功能:

wrap :: Text -> [Text] -> Text
wrap x = intercalate "" . map ((<> x) . (x <>))
Run Code Online (Sandbox Code Playgroud)

其目的是用给定的字符串包装列表的每个元素并将它们连接在一起.

映射的第一个参数周围的括号使我恼火,使用""也是如此.所以我想知道是否有更优雅(或通用,我猜)的方式来表达这个功能?

haskell function parametric-polymorphism

0
推荐指数
1
解决办法
204
查看次数

函数 g = (.).(.) 的类型是什么?

答案是:(a -> b) -> (c -> d -> a) -> c -> d -> b

但我不知道怎么去那里。

haskell types type-inference currying parametric-polymorphism

0
推荐指数
1
解决办法
147
查看次数