Вопрос по haskell – Реализация «шоу» для функции

7

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

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

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

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

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

Ваш Ответ

1   ответ
15

{-# 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>>"

Похожие вопросы