我正在学习Haskell并试图弄清楚如何在haskell中实现"duck typing"和.所以它应该是一个函数,接受char或int,并依赖于concat或添加它.所以函数定义看起来应该是这样的:duckplus ::(AddableUnionType a) - > a - > a - > a
duckplus 1 "1" -- "11"
duckplus 1 1 -- 2
Run Code Online (Sandbox Code Playgroud)
是否可以使用模式匹配?
非惯用的Haskell跟随
您可能应该将此视为Haskells类型系统能够很好地解决的问题.
对于实际工作,我不建议这样的解决方案.
这是一个可能的实现(与蠕虫罐即扩展):
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
class DuckSum a b where
type Result a b :: *
duckplus :: a -> b -> Result a b
instance DuckSum Int String where
type Result Int String = String
duckplus a b = show a ++ b
instance DuckSum String Int where
type Result String Int = String
duckplus a b = a ++ show b
instance DuckSum Int Int where
type Result Int Int = Int
duckplus a b = a+b
Run Code Online (Sandbox Code Playgroud)
这是一个使用此的交互式会话:
?> duckplus (1 :: Int) "1"
"11"
?> duckplus "1" (1 :: Int)
"11"
?> duckplus (1 :: Int) (1 :: Int)
2
Run Code Online (Sandbox Code Playgroud)
注意:您所需要的类型,注释这里1可以是任何Num-也谨慎使用