haskell - 我可以命名函数签名吗?

标签 haskell method-signature

我正在传递一个部分应用的功能。完整的签名是:

import Data.Map as Map 
-- Update the correct bin of the histogram based on the min value, bin width,
-- the histogram stored as a map, and the actual value we are interested in.
updateHist :: Double -> Double -> Map.Map Bin Double -> Double -> 
              Map.Map Bin Double

该函数更新存储直方图数据的 map 。前两个参数给出了我们感兴趣的数据的下界,下一个是直方图的 bin 宽度。我在程序启动时填写这些值,并在整个模块中传递部分应用的函数。这意味着我有大量的函数,其签名如下:
-- Extra the data out of the string and update the histogram (in the Map) with it.
doSomething :: String -> (Map.Map Bin Double -> Double -> Map.Map Bin Double) -> 
               Map.Map Bin Double

这一切都很好,但写“(Map.Map Bin Double -> Double -> Map.Map Bin Double)”相当冗长。我想将它们全部替换为“UpdateHistFunc”作为一种类型,但由于某种原因我一直失败。

我试过了:
newtype UpdateHistFunc = Map.Map Bin Double -> Double -> Map.Map Bin Double

这失败并出现错误:

HistogramForColumn.hs:84:44: parse error on input `->'



我究竟做错了什么?

最佳答案

你是不是很困惑typenewtype这里?

使用 type定义了一个类型同义词,这似乎是你想要做的,而 newtype创建一个需要构造函数名称的新类型,例如 data .

换句话说,你可能想要这个:

type UpdateHistFunc = Map.Map Bin Double -> Double -> Map.Map Bin Double

...或者也许是这样的:
newtype UpdateHistFunc = UpdateHistFunc (Map.Map Bin Double -> Double -> Map.Map Bin Double)

后者显然需要“解包”才能应用该功能。

以供引用:
  • data定义了一种新的代数数据类型,它可以是递归的,具有不同的类型类实例,引入了一层可能的惰性,所有这些东西。
  • newtype使用带有单个参数的单个构造函数定义数据类型,它可以是递归的并且具有不同的实例,但仅用于类型检查;编译后就相当于它包含的类型。
  • type定义了一个类型同义词,它不能是递归的或具有不同的实例,在类型检查时完全扩展,并且仅相当于一个宏。

  • 如果您想知道 data 之间的语义区别和 newtype在“额外的懒惰”方面,比较这两种类型以及它们可能具有的值:
    data DType = DCon DType
    
    newtype NType = NCon NType
    

    例如,如果将这些函数应用于 undefined,您认为这些函数会做什么?与 DCon undefinedNCon undefined , 分别?
    fd (DCon x) = x
    fn (NCon x) = x
    

    关于haskell - 我可以命名函数签名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6392122/

    相关文章:

    Java 集合。添加(E obj),但删除(Object obj)

    haskell - 如何为 GADT 实现棱镜?

    haskell - Haskell 中 Nothing 的类型是什么?

    haskell - ghci 中的 `trace` 函数在第二次调用时不打印

    haskell - foldr (.) id 的类型

    haskell - 找不到模块 Prelude... 包基础的 dyn 库?

    java - private static <T> T cloneX(T x) - <T> 在这里表示什么?

    java - 重构方法头参数顺序

    Java 字节码签名

    c++ - C++中的函数签名和继承