我想要實現與顯示了不同類型的函數參數不同的行爲的arr
-member功能箭頭,例如arr (\x -> (x,x))
應該從arr id
表現不同......GHC爲相同的表達式選擇不同的實例?
下面的代碼:
{-# LANGUAGE Arrows, OverlappingInstances, IncoherentInstances, FlexibleInstances#-}
import Control.Arrow
import Control.Category
import Prelude hiding (id, (.))
class ToPredefinedStr a where
toStr :: a -> String
instance ToPredefinedStr ((->) b (b,b)) where
toStr _ = "b -> (b,b)"
instance ToPredefinedStr (a -> (b,c)) where
toStr _ = "a -> (b,c)"
instance ToPredefinedStr ((a,b) -> c) where
toStr _ = "(a,b) -> c"
instance ToPredefinedStr (a -> b) where
toStr _ = "a -> b"
newtype MyArrow a b c = MA (a b (c, String))
instance (Category a, Arrow a) => Category (MyArrow a) where
-- irrelevant for this example ...
instance (Arrow a) => Arrow (MyArrow a) where
arr f = MA (arr (\x -> (f x, toStr f)))
appMyArr (MA a) = a
但是:它顯示了以下非常奇怪behavor:
> toStr (\x -> (x,x)) -- that works as expected!
"b -> (b,b)"
> appMyArr (arr (\x -> (x,x)))() -- but this does'nt!!
(((),()),"a -> b")
任何人都可以解釋如何得到ghci中選擇b -> (b,b)
- 第二個示例中的表達式\x -> (x,x)
的示例?
一個有趣的建議;我明天一定會試試這個! ...你爲什麼認爲它不能工作? – phynfo
主要是因爲它不會與標準'Arrow'類工作,但如果你的罰款與再肯定的是,它應該工作。但是,它感覺有些脆弱。 – hammar