尝试为集成动力学建模操作员

Attempting to model operators for Integrated Dynamics

Integrated Dynamics 是一个 Minecraft mod,它使用带柯里化的惰性运算符,其行为与 Haskell 非常相似。我一直在编写具有相同签名的函数,但不执行任何操作以尝试更轻松地探索组合运算符。一个例子是 itemName :: Item -> StringitemName _ = ""。这是在 ghci :t itemName 中给出 Item -> String

我试着做了一些稍微复杂一点的,比如

itemListCount :: (Num c) => [a] -> b -> c
itemListCount _ _ = 0

如果我直接用大于或小于来传递它,我希望看到它的签名,希望看到类似 [a] -> b -> c -> d 的东西。一个列表,一个项目(自定义数据类型)一个整数和 return 一个布尔值。使用 :t (lessThan . itemListCount) 调用时会出现错误:

Couldn't match type 'b0 -> Integer' with 'Int'.
Expected type: [a] -> Int
  Actual type: [a] -> b0 -> Integer

这是因为我用 :t 调用它,它试图评估而不是组合函数吗?

(lessThan . itemListCount) 等同于 \x -> lessThan (itemListCount x)。这是一个函数,它接受一个值,然后用这个值调用 itemListCount,然后用 itemListCount 返回的任何值调用 lessThan

itemListCount 的类型是(忽略 Num 约束)[a] -> b -> c。它是一个接受任何类型列表的函数,然后 returns 一个接受任何类型作为输入和 returns 任何数字类型作为输出的函数。

所以在\x -> lessThan (itemListCount x)中,x应该是一个任意类型的列表,而(itemListCount x)是一个函数,它可以将任意类型作为输入,returns可以是任意数字类型作为输出。据推测,这不是 lessThan.

的有效参数