8

isFunc :: a -> Bool任意の値が (任意の種類の) 関数であるかどうかを判断する関数を作成することは可能ですか?

foo :: Int -> Int
bar :: Char -> Char -> Char    

> isFunc foo
True
> isFunc bar
True
> isFunc 3
False
> isFunc 'a'
False

私はData.Dynamicを使用しているため、事前に型を特定することはできません。

4

2 に答える 2

11

何を求めているのか、何をする必要があるのか​​ はData.Dynamic別のもののようです。fromDyn/で抽出する前に、値の正確なタイプを知る必要がありますfromDynamicDynamic分析する必要がある関数値が含まれているかどうかを判断するにはTypeRep:

isFuncDynamic x = typeRepTyCon (dynTypeRep x) == typeRepTyCon (typeOf2 id)

(これが最も簡潔な実装でない場合はご容赦ください。)

于 2012-04-21T12:02:42.173 に答える
10

パラメトリシティはノーと言います。タイプの唯一の機能

a -> Bool

定数関数です。

ただし、アドホック多相性ともう少しchutzpahを使用すると、次のことができます。

{-# LANGUAGE OverlappingInstances, FlexibleInstances #-}

class Sick x where
  isFunc :: x -> Bool

instance Sick (a -> b) where
  isFunc _ = True

instance Sick x where
  isFunc _ = False

そしてそれはあなたが持っているように見えます

*Sick> isFunc 3
False
*Sick> isFunc id
True

しかし、それは奇妙なことのように思えます。結果としてどのような用途がありBoolますか?

于 2012-04-21T11:40:07.550 に答える