我想创建一个非常人性化的开发环境,我正在考虑使用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
?问题是我不知道提前的类型是什么。用户输入记录,我希望能够呈现它。似乎我必须修改编译器以支持这一点。
答案 0 :(得分:1)
实例头中不允许记录。有关讨论和原因,请参阅this thread。如果我们要为它们编写实例,则必须将它们包含在data
或newtype
中。
但是,有一个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-foreign
或purescript-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
。