如何使用PureScript向用户显示任何数据类型?

时间:2016-05-25 09:41:40

标签: purescript

我想创建一个非常人性化的开发环境,我正在考虑使用PureScript来提供语言部分。我看到开箱即用,Show不适用于Show实例的记录:

log (show {a:5})

'试用PureScript!' (http://try.purescript.org/)编译器说:

   No type class instance was found for

   Prelude.Show { a :: Int
                }

是否有用于一般打印任何数据结构的工具,尤其是包含记录的数据结构?是否有一些类型的技巧可以支持通常在记录上行走以支持我自己的类present :: Present a => a -> Presentation?问题是我不知道提前的类型是什么。用户输入记录,我希望能够呈现它。似乎我必须修改编译器以支持这一点。

3 个答案:

答案 0 :(得分:1)

实例头中不允许记录。有关讨论和原因,请参阅this thread。如果我们要为它们编写实例,则必须将它们包含在datanewtype中。

但是,有一个generics library和一个派生机制可以让我们生成Show个实例。

import Data.Generic

data Foo = Foo {a :: Int} | Bar {b :: String}
derive instance genericFoo :: Generic Foo

instance showFoo :: Show Foo where
   show = gShow

答案 1 :(得分:1)

使用purescript-foreignpurescript-argonaut库在PureScript中处理无类型数据。我建议argonaut。

这些字段的未知字段和未知类型的记录的表示形式为StrMap Json包中的purescript-maps。我建议您在这里查看(尚未合并的)文档:https://github.com/hdgarrood/purescript-argonaut-core/blob/565c7e650c51c45570663cf1838ec9cfa307a9c7/README.md。我还汇总了一个小例子,展示了如何匹配JavaScript中的异构数组:

-- src/Main.purs
module Main where

import Prelude
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Console (CONSOLE, log)
import Data.Argonaut (foldJson, Json)
import Data.Foldable (traverse_)

newtype Presentation = Presentation String

unPresentation :: Presentation -> String
unPresentation (Presentation p) = p

instance showPresentation :: Show Presentation where
  show = unPresentation

class Present a where
  present :: a -> Presentation

instance presentInt :: Present Int where
  present = Presentation <<< show

instance presentNumber :: Present Number where
  present = Presentation <<< show

instance presentBoolean :: Present Boolean where
  present = Presentation <<< show

instance presentString :: Present String where
  present = Presentation

presentJson :: Json -> Presentation
presentJson =
  foldJson
    (const (Presentation "null"))
    present
    present
    present
    (const (Presentation "array"))
    (const (Presentation "record"))

foreign import vals :: Array Json

main :: forall e. Eff ( console :: CONSOLE | e) Unit
main = traverse_ (log <<< show <<< presentJson) vals

和相应的js文件:

// src/Main.js
// module Main

exports.vals = [1, 1.2, "hello", true, [1,2,3], {a: 3, b: "hi"}];

运行此程序会为您提供:

> pulp run
* Building project in/home/creek/Documents/so-christopher-done
* Build successful.
1.0
1.2
hello
true
array
record

答案 2 :(得分:1)

是,traceAny以及来自purescript-debug的相关功能。以下是一些示例:test/Main.purs#L22。我发布了Pursuit的链接,但目前似乎没有purescript-debug