Попытка моделирования операторов для интегрированной динамики - PullRequest
2 голосов
/ 03 марта 2020

Integrated Dynamics - это мод Minecraft, который использует ленивых операторов с карри и действует очень похоже на Haskell. Я писал функции, которые имеют одинаковую сигнатуру, но не выполняют ничего, что можно попробовать, и легче исследовать объединение операторов. Примером является itemName :: Item -> String с itemName _ = "". Это значит, что ghci :t itemName нужно указать как Item -> String.

. Я попытался сделать пару более сложных, таких как

* 1010. *

Я бы хотел увидеть подпись этого, если я передам его напрямую с большим или меньшим, ожидая увидеть что-то вроде [a] -> b -> c -> d. List, Item (тип данных custm), целое число и возвращаемое логическое значение. при вызове с :t (lessThan . itemListCount) Это выдает ошибку:

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

Это потому, что я вызываю его с :t, что он пытается оценить вместо объединения функций?

1 Ответ

0 голосов
/ 03 марта 2020

(lessThan . itemListCount) совпадает с \x -> lessThan (itemListCount x). Это функция, которая принимает одно значение, затем вызывает itemListCount с этим значением, а затем вызывает lessThan с тем, что вернул itemListCount. Тип

itemListCount (игнорируя ограничение Num) [a] -> b -> c. Это функция, которая принимает список любого типа, а затем возвращает функцию, которая принимает любой тип в качестве ввода и возвращает любой тип числа в качестве вывода.

Так что в \x -> lessThan (itemListCount x), x должен быть списком любого типа, а (itemListCount x) - это функция, которая принимает любой тип в качестве ввода и возвращает любой тип числа в качестве вывода. Предположительно, это неверный аргумент для lessThan.

...