как писать числа в лямбде с помощью ghci - PullRequest
0 голосов
/ 28 октября 2009

Я новичок в Haskell, использую Ghci.

У меня есть функция с именем три, которую я хочу написать как

let three =  \x->(\y->(x(x(x y)))) 

ОК, это работает, но когда я пытаюсь

three (2+) 4

Это не работает. Вместо этого я получаю некоторую ошибку «не могу создать бесконечный тип».

Пожалуйста, помогите мне.

Ответы [ 2 ]

6 голосов
/ 29 октября 2009
ghci> let three = \x->(\y->(x(x(x y))))
ghci> three (2+) 4
10
ghci> three return "deconstructivist"

<interactive>:1:6:
    Occurs check: cannot construct the infinite type: t = m t
      Expected type: t
      Inferred type: m t
    In the first argument of 'three', namely 'return'
    In the expression: three return "deconstructivist"
ghci> :t three
three :: (t -> t) -> t -> t
ghci> :t return
return :: (Monad m) => a -> m a
  • Пример, который вы предоставили three (2+) 4, работает! Лучше убедитесь, что приведенные вами примеры действительно воспроизводят вашу проблему.
  • Что касается другого примера, такого как приведенный выше с return, то дело в том, что возвращаемый результат имеет тип, отличный от указанного. Если бы тип был таким же, он был бы бесконечным (и типа * -> * -> * -> ...), который Haskell не поддерживает.
0 голосов
/ 03 декабря 2014

Пример, который вы приводите, работает. Давайте объясним, почему:

three f = f . f . f
-- so...
three :: (a -> a) -> a -> a

Функция должна иметь тип a -> a, потому что она получит собственный аргумент, для которого требуется тип. (2+) имеет тип Num a => a -> a, поэтому three (2+) 4 будет отлично работать.

Однако, когда вы передаете функцию типа return типа Monad m => a -> m a, которая возвращает другой тип, она не будет соответствовать установленному нами требованию (a -> a). Это где и когда ваша функция не будет работать.

Пока вы занимаетесь этим, попробуйте создать такую ​​функцию, как doTimes с типом Integer -> (a -> a) -> a -> a, которая выполняет данную функцию заданное число раз - это хороший следующий шаг после выполнения этой функции.

...