在haskell中,是否有可能創建一個能夠處理多個不同資料型別的輸入和輸出的函式?
例如,讓我們假設一個函式能夠對[Char]和Int進行模式匹配,并分別回傳兩種資料型別。
fun 1 = 2
fun "textIn"="textOut"
這可能嗎?
uj5u.com熱心網友回復:
正如Willem Van Onsem所指出的,你可以用一個typeclass來做一些事情:
class Fun a where
fun :: a -> a
instance Fun Integer where
樂趣 1 = 2
instance Fun String where
樂趣 "textIn" = "textOut"
這是否是合理的取決于情況。設計好的類是很難的,我強烈建議Haskell的初學者完全避開它。首先要學會設計你自己的函式和型別,并宣告標準/庫中類的實體。
freestyle指出,你可以用代數資料型別(ADT)做一些事情,我認為這是一個好得多的開始。
data Funny
= FunnyInteger Integer >。
| FunnyString String
deriving Show --所以你可以在GHCi中列印這些。
fun :: Funny -> Funny
fun (FunnyInteger 1) = FunnyInteger 2)
fun (FunnyString "textIn"/span>) = FunnyString "textOut"
freestyle也提到了通用代數資料型別(GADTs)。這些絕對不適合初學者,但作為對未來的提示......
data FooTy a where
FooInteger :: FooTy Integer
FooString :: FooTy String ::.
foo :: FooTy a -> a -> a
foo FooInteger 1 = 2
foo FooString "textIn"/span> = "textOut"/span>
uj5u.com熱心網友回復:
通過類Typeable:
{-# LANGUAGE ScopedTypeVariables #-}
import Control.Monad
import Data.Typeable
import Data.Foldable
fun :: Typeable a => a -> Maybe a
fun x = asum $ map ($x)
[ appT $ (x::Int) -> 2 <$ guard (x == 1)
, appT $ (x::String) -> "textOut" <$ guard (x =="textIn")
]
appT :: (Typeable a, Typeable b) => (b -> Maybe b) -> a -> Maybe a
appT f x = cast =<< f =<< cast x
main :: IO ( )
main = do
print $ fun (1 :: Int)
print $ fun "textIn"
print $ fun [1 :: Int, 2]
輸出:
Just 2
Just "textOut"
Nothing
appT是輔助函式(也許它在某個包里)。
你也可以看到。Dynamic, syb.
但這通常不是Haskell的習慣方式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/316898.html
標籤:
