或者說,什麼是最地道的方式在Haskell做到這一點?
地道?如果你真的想要一個能做($$$)
的函數,你的代碼可能就像你會得到的那樣習慣。
我更願意看到一些聰明的把戲
哦,在該情況。
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE UndecidableInstances #-}
class ListApply f a r | f -> a r where
($...) :: f -> [a] -> r
instance (TypeCast b r) => ListApply b a r where
x $... _ = typeCast x
instance (ListApply f a r) => ListApply (a -> f) a r where
f $... (x:xs) = (f x) $... xs
你去那裏,一個完全通用的解決方案:任意給定元數的函數簽名像a -> a ... -> b
,它適用於需要一個列表[a]
的許多元素。演示:
ones :: [Int]
ones = repeat 1
test1 x = x
test2 x y = x + y
test3 x y z = (x + z) * (y + z)
在GHCI:
> test1 $... ones
1
> test2 $... ones
2
> test3 $... ones
4
我一定會接受 「永遠不要做這在真正的代碼」,如果這是最好的答案
你可能想要去那個。
哦,有點樣板的運行上面的代碼需要:
class TypeCast a b | a -> b, b->a where typeCast :: a -> b
class TypeCast' t a b | t a -> b, t b -> a where typeCast' :: t->a->b
class TypeCast'' t a b | t a -> b, t b -> a where typeCast'' :: t->a->b
instance TypeCast' () a b => TypeCast a b where typeCast x = typeCast'() x
instance TypeCast'' t a b => TypeCast' t a b where typeCast' = typeCast''
instance TypeCast''() a a where typeCast'' _ x = x
這類型級元編程的Oleg Kiselyov禮貌的瑞士軍刀。
我沒有看到你的代碼有什麼問題。它很短並且重要。並非所有事情都必須是(或應該是)無點。 – sepp2k 2010-05-24 18:33:22
我不一定認爲它有什麼問題 - 我只是很好奇是否有一個簡潔的方法來做到這一點,而不需要定義像'$$$'這樣的新組合器。 – 2010-05-24 18:35:46
請注意,這是一個部分函數,所以...可能是一個糟糕的主意一般:)你可能會更好用一個'($$$)::(a - > a - > a - > b) - > [a] - >也許b' – 2014-08-03 00:49:44