2016-02-25 92 views
3

在使用PureScript教程時,代碼示例開始使用「=>」而不引入它。結果我不明白何時使用'=>'而不是' - >'。在Purescript; - >和=>有什麼區別?

例如這使用 '=>':

instance showArray :: (Show a) => Show (Array a) where 
    show array = "[" <> map show array <> "]" 

其中如此使用 ' - >':

greet :: forall r. { name :: String | r} -> String 
greet namedThing = "Hello, " ++ namedThing.name 

回答

5

(Show a) =>是一種類型的約束,這限制了類型a到的實例類Showa -> b是一種函數。所以這段代碼

foo :: forall a. (Show a) => a -> b 

是一個功能fooab和類型a必須有類的實例Show

在面向對象的語言會是這樣的

public B foo<A,B>(A x) where A:IShow 
+0

'FORALL [R 。 {name :: String | r}似乎也是一個約束。 (任何具有name :: String屬性的對象。) –

+0

不,約束只使用'=>'和類型類。 '{name :: String | r}'只是一個匿名類型。你可以爲這個類型定義一個名字'type Name r = {name :: String | r}''greet :: forall r。名字r - >字符串' – ais

+0

'greet :: forall r。名字r - >'好像是'greet ::(Name r)=>'...我錯過了什麼? –