isFunc :: a -> Bool
任意の値が (任意の種類の) 関数であるかどうかを判断する関数を作成することは可能ですか?
foo :: Int -> Int
bar :: Char -> Char -> Char
> isFunc foo
True
> isFunc bar
True
> isFunc 3
False
> isFunc 'a'
False
私はData.Dynamicを使用しているため、事前に型を特定することはできません。
isFunc :: a -> Bool
任意の値が (任意の種類の) 関数であるかどうかを判断する関数を作成することは可能ですか?
foo :: Int -> Int
bar :: Char -> Char -> Char
> isFunc foo
True
> isFunc bar
True
> isFunc 3
False
> isFunc 'a'
False
私はData.Dynamicを使用しているため、事前に型を特定することはできません。
何を求めているのか、何をする必要があるのか はData.Dynamic
別のもののようです。fromDyn
/で抽出する前に、値の正確なタイプを知る必要がありますfromDynamic
。Dynamic
分析する必要がある関数値が含まれているかどうかを判断するにはTypeRep
:
isFuncDynamic x = typeRepTyCon (dynTypeRep x) == typeRepTyCon (typeOf2 id)
(これが最も簡潔な実装でない場合はご容赦ください。)
パラメトリシティはノーと言います。タイプの唯一の機能
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
ますか?