2015-01-02 2 views
3

В функции id языка Haskell определяется как единица композиции:определить `id` функцию, используя точечную нотацию бесплатно

id :: a -> a 
id x = x 

Есть ли способ определить Haskell» id функцию, используя точечную нотацию бесплатно? Я имею в виду не непосредственно ссылки это нравится:

same :: a -> a 
same = id 
+4

Существует много способов: 'flip const undefined' или' head. return' и многие другие, но нет смысла. –

ответ

16

версия pointfree из id ... ну, id. id часто берется как фундаментальный оператор в конструкциях с нулевой точкой, своего рода примитив, на котором построены больше комбинаторов.

Если вы действительно хотите, вы можете восстановить id от других более сложных операторов, например. эксплуатируя Monad ((->) a) экземпляра:

id = join const 

или экземпляр Applicative ((->) a)

id = const <*> const 

(в комбинаторной логике, это I = S K K так <*> является S и const является K)

Ничто не может быть проще, чем id сам.

4

Этот вопрос интересный, потому что id по существу является личностью любой математической группы функций, входящих в состав. Проще говоря, когда вы получаете две противоположные функции и составляете их, вы получаете id.

Таким образом, любой из них будет работать полиморфно и таким же образом, хотя, естественно, медленнее:

id :: a -> a 
---------------------------- 
id = snd . (0,) 
id = fst . (,0) 
id = (!! 0) . return 
id = ($ 0) . const 
id = (\(Just n) -> n) . Just 

Или мы могли бы записать его в простой лямбда-выражения, что является хорошей практикой и очень просто:

Все они имеют стиль без точек, что должно быть удовлетворительным для вашего вопроса, но это не просто свободные от очков, но совершенно беспутные. Все эти решения могут показаться очень действительными, и они есть, но они не эквивалент id. Эти решения, не считая последнего, создают и деконструируют структуры данных, которые являются дорогостоящими по производительности. Стиль, свободный от очков, может быть хорошей практикой, но не везде.

Смежные вопросы