Я не знаю, как вы получили что-то кроме ввода синтаксического анализа из этого:
(.) f f = (\x -> f (f x))
но определение, которое вы дали: twice = \x -> \x -> x
не имеет ничего общего с использованием чего-то «дважды» - действительно, если вы подставите некоторые значения:
twice a b
= (\x -> \x -> x) a b
= (\x -> (\x -> x)) a b -- (rename the inner x)
= (\x -> (\y -> y)) a b
= ((\x -> (\y -> y)) a) b
= (\y -> y) b
= b
и действительно GHCi скажет вам то же самое:
> let twice = \x -> \x -> x
> :t twice
twice :: t -> t1 -> t1
> twice "a" "b"
"b"
Теперь я думаю, вы хотите что-то вроде этого:
let twice f x = f (f x)
Например:
> let twice f x = f (f x)
> twice (+1) 5
7
как видите, twice (+1)
добавляет 2 (или дважды один).
Теперь, как вы можете сделать это, используя (.)
? - Что ж, твоя интуиция не подвела:
> let twice f = f . f
> twice (+1) 5
7
относительно модуля
Поскольку вы просили модуль - он отлично компилируется (и загружается в GHCi) в моей системе (системах):
module Twice where
twice :: (a->a) -> a -> a
twice f = f . f
замечание:
это работает, только если вы включаете (.)
из прелюдии (или GHC.Base) - я подозреваю, что вы получили какое-то упражнение, скрывающее прелюдию - в этом случае вы должны сначала определить (.)
для себя (скорее всего, другое упражнение)
если вам нужно реализовать это самостоятельно:
(.) :: (b -> c) -> (a -> b) -> a -> c
(.) g f x = g (f x)
person
Random Dev
schedule
22.09.2014
twice
и решаю его. - person Random Dev   schedule 22.09.2014twice
- person Random Dev   schedule 22.09.2014(((\x.(\x.x)) f) x)
- есть ли в результатеf
? - person Random Dev   schedule 22.09.2014twice
и синтаксисом - person Random Dev   schedule 22.09.2014