2017-02-16 63 views
1

我看到了這樣一個問題:Purescript默認`Show`實例記錄

,我發現我可以使用purescript調試打印出來,例如使用:

> traceAny {a:1} id 
{ a: 1 } 
unit 

我在想,但是背後的東西沒有用於記錄的默認Show實例的理由:

> {a:1} 
Error found: 
in module $PSCI 

    No type class instance was found for 

    Data.Show.Show { "a" :: Int 
        } 

回答

4

Show只是實現爲庫代碼,所以沒有辦法的情況下可以寫出可以容納每一個可能的記錄。例如,您可以說「此記錄中的每個值的類型必須也有一個Show實例」,這需要有某種限制。實際的實現也需要有點魔力,因爲你無法迭代記錄中的標籤。

關於重整Show,such as this one的討論已經有幾次,可能會解決這個問題,通過使Show完全具有魔力,並且只能用於調試目的。

雖然這並不能真正解決你在這裏的情況下,也可以依靠Generic得出做出Show例如用於newtype「d記錄,這可能需要一些痛苦了這種事情的:

import Data.Generic (class Generic, gShow) 

newtype MyRecord = MyRecord { a :: Int } 

derive instance genericMyRecord :: Generic MyRecord 

instance showMyRecord :: Show MyRecord where 
    show = gShow 

如果你得到Newtype過它使記錄更容易使用,你可以使用與包裝幫助各種操作/解開/在NEWTYPE下運行工作等

+0

謝謝GB,我一直認爲記錄與原始類型相似。 –

+0

當你的newtype/data聲明有一個類型變量時,你如何做到這一點?即它是'* - > *'而不是'*'。 – rgrinberg

+1

您還需要在類型變量中包含一個約束。因此,而不是'實例名::類類型'你可以有'實例名:: Class a => Class(Type a)'。 –