Вы путаете type
и newtype
здесь?
Использование 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 undefined
и NCon undefined
соответственно?
fd (DCon x) = x
fn (NCon x) = x