Реализация «шоу» для функции

Я хотел бы реализоватьshow метод для (бинарных) функций и сделать его способным противостоять эндофункциям(a -> a).

Что-то вроде кода псевдо-haskell:

instance Show (a->b) where
    show fun = "<<Endofunction>>" if a==b
    show fun = "<<Function>>" if a\=b

Как я могу различить два случая?

 Daniel Wagner03 июн. 2012 г., 20:14
Являетсяconst 3 эндофункция или функция?
 Ashe04 июн. 2012 г., 12:57
@ DanielWagner: да.
 leftaroundabout03 июн. 2012 г., 15:30
Это было бы не хорошоShow экземпляр вообще. Вы должны написать что-то вродеisEndo :: (a->b) -> Bool, а затем с помощью простого охранника создайте подходящий текст там, где вы хотите.

Ответы на вопрос(1)

Решение Вопроса

{-# LANGUAGE OverlappingInstances, FlexibleInstances #-}
module FunShow where

instance Show ((->) a a) where
    show _ = "<<Endofunction>>"

instance Show ((->) a b) where
    show _ = "<<Function>>"

Тебе нужноOverlappingInstances с момента инстанцииa -> b также соответствует эндофункциям, так что есть совпадение, и вам нужноFlexibleInstances потому что языковой стандарт требует, чтобы переменные типа в объявлениях экземпляров были разными.

*FunShow> show not
"<<Endofunction>>"
*FunShow> show fst
"<<Function>>"
*FunShow> show id
"<<Endofunction>>"

Ваш ответ на вопрос