簡體   English   中英

檢查haskell中的參數類型

[英]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

為此,您需要一些擴展,例如ScopedTypeVariablesGADTs

通常,這通常不是一個好主意。 在采用此方法之前,您首先應該了解您是否真正需要它: Typeable功能非常強大,當更簡單的替代方法不夠用時,應將其用作最后的手段。 就像AJFarmar展示的那樣,自定義類型類可能是您任務的更好解決方案。

還要注意,沒有類型類約束,根據其“自由定理”(AKA參數屬性),函數foo :: a -> a只能是標識函數,也可以是未定義的(例如,無限遞歸或運行時)例外)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM