Function to output function name

后端 未结 5 1481
离开以前
离开以前 2020-12-17 22:20

Is it possible in Haskell to implement a function which returns its own function name?

A possible type could be (a -> b) -> String.

5条回答
  •  旧时难觅i
    2020-12-17 23:05

    I don't know what you need it for, but maybe a simplistic solution suffices? Like so:

    data NamedFunction a b = NamedFunction { 
        name :: String,
        apply :: a -> b
    }
    
    timesTwo :: NamedFunction Int Int
    timesTwo = NamedFunction "timesTwo" (\x -> 2 * x)
    

    which you can use as follows:

    ghci> timesTwo `apply` 7
    14
    ghci> name timesTwo
    "timesTwo"
    

    You can then write your own version of (.):

    -- contrast (.)  ::    (b -> c) ->          (a -> b) ->         (a -> c)
    compose :: NamedFunction b c -> NamedFunction a b -> NamedFunction a c
    compose (NamedFunction n1 f1) (NamedFunction n2 f2) = 
         NamedFunction (n1++ " . " ++ n2) (f1 . f2)
    

    In ghci:

    ghci> let f = timesTwo `compose` timesTwo in (f `apply` 7, name f) 
    (28,"timesTwo . timesTwo")
    

    You'll have to reimplement your own versions of map, filter and so on, and you're bound to run into other problems later, but maybe this is all you need...

提交回复
热议问题