鸭子在haskell打字和

Rax*_*ter 2 haskell types

我正在学习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)

是否可以使用模式匹配?

Car*_*ten 7

警告:

非惯用的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-也谨慎使用