2016-01-22 20 views
1

是否可以使用patten匹配与柯里化数据?假设下面的代码:Haskell:使用patten匹配与柯里化数据

data Bind = Echo String | Sum Int Int 

getOperation (Echo x) = "Echo" 
getOperation (Sum x y) = "Sum" 

main = getOperation (Sum 1) 

它失败,因为Sum 1的类型为Int -> Bind,并getOperation的类型为Bind -> String

我的意思是获取一个字符串,即使数据已被curried,也可以使用数据构造函数。像这样的假代码:

getOperation (Echo x) = "Echo" 
getOperation (Echo) = "Echo"  -- Pattern matching for curried data 
getOperation (Sum x y) = "Sum" 
getOperation (Sum x) = "Sum"  -- Pattern matching for curried data 
+0

你自己说的'Echo'是'字符串 - > Bind' - 所以现在它是一个带'String'并返回一个'Bind'的函数,可悲的是你不能模式匹配函数(它可能是'\ _ - > Sum 0 0'以及所有'getOperation'在这一点上都知道的) – Carsten

回答

1

将名称附加到值是没有问题的。

data Named a = Named { name :: String, value :: a } 

-- there is a very natural Functor instance for Named as well, which 
-- could be used to implement this 
(<$$>) :: Named (a -> b) -> a -> Named b 
Named n f <$$> x = Named n (f x) 

下面是如何使用它的一个样本:

data Bind = Echo String | Add Int Int 

echo :: Named (String -> Bind) 
add :: Named (Int -> Int -> Bind) 
add = Named "Add" Add 
echo = Named "Echo" Echo 

main = do 
    putStrLn . name $ echo 
    putStrLn . name $ echo <$$> "hi" 
    putStrLn . name $ add 
    putStrLn . name $ add <$$> 3 
    putStrLn . name $ add <$$> 3 <$$> 4 

这将产生:

Echo 
Echo 
Add 
Add 
Add