[英]Check type of parameter in haskell
我有一個函數(a->a)
,可以接受不同的類型,但是有沒有辦法確定參數是什么數據類型? 喜歡
foo :: a -> a
foo a == int =..
foo a == char =..
無論如何,在haskell中是否可以進行這樣的檢查?
沒有。
請改用數據類型:
data MyType = MyInt Int | MyChar Char
foo :: MyType -> MyType
foo (MyInt i) = MyInt (i + 1) -- Or whatever
foo (MyChar c) = case c of {'a' -> MyChar 'A'; k -> MyChar k}
盡管這當然限制了您可以使用的類型。
或者,使用類型類:
class MyClass a where
foo :: a -> a
instance MyClass Int where
foo i = i + 1
instance MyClass Char where
foo c = case c of {'a' -> 'A'; k -> k}
-- N.B. foo :: MyClass a => a -> a
盡管這再次限制了您可以使用的類型。
實現此目的的一種方法(但是我不建議這樣做)是添加Typeable
約束。
foo :: forall a . Typeable a => a -> a
foo x = case eqT :: a :~: Int of -- check if a = Int
Just Refl -> x + 1 -- here we can use x as an Int
Nothing -> x -- here we can not use x as an Int
為此,您需要一些擴展,例如ScopedTypeVariables
和GADTs
。
通常,這通常不是一個好主意。 在采用此方法之前,您首先應該了解您是否真正需要它: Typeable
功能非常強大,當更簡單的替代方法不夠用時,應將其用作最后的手段。 就像AJFarmar展示的那樣,自定義類型類可能是您任務的更好解決方案。
還要注意,沒有類型類約束,根據其“自由定理”(AKA參數屬性),函數foo :: a -> a
只能是標識函數,也可以是未定義的(例如,無限遞歸或運行時)例外)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.