Haskell, функции высшего порядка и какой вход здесь принадлежит? - PullRequest
0 голосов
/ 13 октября 2018

, поскольку я не понимаю функции более высокого порядка в haskell, я попробовал это

tryout :: (a ->b) -> Int
tryout p q = 4

, и я также мог бы попробовать p = 4, почему возможно сделать p так же, как pq?

tryout :: (a ->b) -> Int
tryout p q = 4

и когда я играл, пытаясь заполучить его, я позвонил на попытку с 3 4, 3-> 4 и с 3, и все это не сработало.Может ли кто-нибудь объяснить мне, что я здесь делаю, почему p, а также pq могут быть записаны (это, вероятно, потому, что p = a-> b и p en q - это a и b), и я мог бы получить пример того, что ямог сделать вызов проба?

1 Ответ

0 голосов
/ 13 октября 2018

tryout принимает любую функцию в качестве аргумента и возвращает целое число.Поскольку у вас нет никакого значения для вызова функции, tryout ничего не может сделать, кроме как игнорировать ее и вернуть некоторое целое число.(Существует одна общая реализация tryout для каждого значения типа Int.)

tryout :: (a -> b) -> Int
tryout _ = 4
-- tryout (+) == 4; (+) :: Num x => x -> x -> x, where a ~ x and b ~ x -> x
-- tryout return == 4; return :: Monad m => x -> m x, where a ~ x and b ~ m a
-- tryout length == 4; length :: Foldable t => t x -> Int, where a ~ t x and b ~ Int
-- etc

Если tryout также принял дополнительный аргумент для типа a,Вы могли бы по крайней мере применить функцию, чтобы получить значение типа b, но вы все равно ничего не могли с этим поделать, поскольку tryout должен возвращать Int.

tryout :: (a -> b) -> a -> Int
tryout _ _ = 4

-- tryout length "foo" == 4; a ~ String, b ~ Int

Теперь представьте, что помимо функции типа a -> b, значения типа a, у вас также есть аргумент типа b -> Int. Теперь мы, наконец, можем сделать что-то нетривиальное (хотя все еще простое).

tryout :: (a -> b) -> a -> (b -> Int) -> Int
tryout f x g = g (f x)

Мы применяем f к x, чтобы получить значение типа b, затемпередайте это g, чтобы получить Int, который мы можем вернуть.Это не определение only , которое проверяет тип;мы все еще можем игнорировать f, x и g и возвращать фиксированный Int, как в предыдущих примерах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...