尝试为集成动力学建模操作员
Attempting to model operators for Integrated Dynamics
Integrated Dynamics 是一个 Minecraft mod,它使用带柯里化的惰性运算符,其行为与 Haskell 非常相似。我一直在编写具有相同签名的函数,但不执行任何操作以尝试更轻松地探索组合运算符。一个例子是 itemName :: Item -> String
和 itemName _ = ""
。这是在 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
.
的有效参数
Integrated Dynamics 是一个 Minecraft mod,它使用带柯里化的惰性运算符,其行为与 Haskell 非常相似。我一直在编写具有相同签名的函数,但不执行任何操作以尝试更轻松地探索组合运算符。一个例子是 itemName :: Item -> String
和 itemName _ = ""
。这是在 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
.