我可以命名功能签名吗?

Tim*_*rry 10 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
Run Code Online (Sandbox Code Playgroud)

该函数更新存储直方图数据的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
Run Code Online (Sandbox Code Playgroud)

这很好,花花公子,但写"(Map.Map Bin Double - > Double - > Map.Map Bin Double)"相当冗长.我想用"UpdateHistFunc"替换它们作为一种类型但由于某种原因我一直都失败了.

我试过了:

newtype UpdateHistFunc = Map.Map Bin Double -> Double -> Map.Map Bin Double
Run Code Online (Sandbox Code Playgroud)

这失败了,错误:

HistogramForColumn.hs:84:44:输入` - >'解析错误

我究竟做错了什么?

C. *_*ann 17

你是混乱typenewtype这里?

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

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

type UpdateHistFunc = Map.Map Bin Double -> Double -> Map.Map Bin Double
Run Code Online (Sandbox Code Playgroud)

......或者这个:

newtype UpdateHistFunc = UpdateHistFunc (Map.Map Bin Double -> Double -> Map.Map Bin Double)
Run Code Online (Sandbox Code Playgroud)

后者显然需要"解开"才能应用该功能.


以供参考:

  • data 定义了一个新的代数数据类型,它可以是递归的,具有不同类型类的实例,引入了额外的可能的懒惰层,所有这些东西.
  • newtype定义一个数据类型,其中一个构造函数采用单个参数,该参数可以是递归的并且具有不同的实例,但仅用于类型检查; 编译后,它等同于它包含的类型.
  • type 定义类型同义词,它不能递归或具有不同的实例,在类型检查时完全展开,并且只比宏更多.

如果你想知道有关的语义差别data,并newtype在那里"额外懒惰"而言,比较这两种类型的可能值,他们可以有:

data DType = DCon DType

newtype NType = NCon NType
Run Code Online (Sandbox Code Playgroud)

举例来说,你觉得什么,如果应用到这些功能会做undefined对比DCon undefined,并NCon undefined分别?

fd (DCon x) = x
fn (NCon x) = x
Run Code Online (Sandbox Code Playgroud)

  • @Tim Perry:一旦提供解决方案,为什么*任何*问题都会被遗忘?在某些方面,既不是初学者也不是专家的人所犯的看似愚蠢的错误都有最有用的答案,因为它们表明现有材料可能不够清晰的概念.想象一下,有人犯了同样的错误,并使用谷歌搜索"输入解析错误"newtype`.那个查询已经把这个答案作为第二个结果! (6认同)