标签: purescript

Purescript中的读者Monad

我正在玩Purescript中的Reader monad,我遇到了一个奇怪的行为.我不知道是不是因为我对这个monad缺乏理解,或者我错过了其他的东西.

这是我的代码:

type Level = Number
type Doc = Reader Level String

renderLine :: String -> Level -> String
renderLine s 0 = s
renderLine s l = "\t" ++ (renderLine s (l - 1))

line :: String -> Doc
line s = do
    level <- ask
    return (renderLine s level)
Run Code Online (Sandbox Code Playgroud)

这没关系,会编译.不过,在此之前我在我的功能行中尝试了一些更简单的方法:

line :: String -> Doc
line s = do
    level <- ask
    return "Hello Reader monad"
Run Code Online (Sandbox Code Playgroud)

尽管(renderLine s level)和"Hello Reader monad"具有相同的类型,但它不会编译.它会抛出这个错误:"找不到Control.Monad.Reader.Class.MonadReader u14555(Control.Monad.Reader.Trans.ReaderT Prim.Number Control.Monad.Identity.Identity)的实例"

我确定我错过了什么,但我不知道是什么.

reader-monad purescript

2
推荐指数
1
解决办法
295
查看次数

有没有办法获得不安全的子记录?

type Foo = {
  x :: Int,
  y :: Int
}

type Bar = {
  x :: Int
}

foo :: Foo
foo = {x:1,y:2}
bar :: Bar
bar = foo
Run Code Online (Sandbox Code Playgroud)

无法匹配类型

()

与类型

(y ::整数)

为什么这不可能呢?

我不能使用

type Bar a = {
  x :: Int | a
}
Run Code Online (Sandbox Code Playgroud)

而且不想重新创建记录

bar = {x : foo.x}
Run Code Online (Sandbox Code Playgroud)

是unsafeCoerce唯一的选择吗?

使用可能会有什么问题unsafeCoerce?

purescript

2
推荐指数
1
解决办法
108
查看次数

Purescript 行多态性。什么是正确的语法?

使用基于“Purescript by Example”第 5 章中的示例的函数,并且对如何声明多态行类型感到有些困惑。

以下编译正常

type Student = {
              first :: String,
              last :: String,
              class :: String
            }

type GymMember = {
              first :: String,
              last :: String,
              benchPressPB :: Int
            }

daveG :: GymMember
daveG = {
        first: "Dave",
        last: "Bro",
        benchPressPB: 300
    }

philS :: Student
philS = {
        first : "Dave",
        last : "Swat",
        class : "1A"
      }

 schoolRollName :: forall t15.
  { last :: String
  , first :: String
  | t15
  } -> String …
Run Code Online (Sandbox Code Playgroud)

purescript

2
推荐指数
1
解决办法
945
查看次数

在 Purescript 中按 ID 选择元素

是否有一个函数purescript-halogen可以通过它来选择一个元素id,或者我是否需要自定义它的角色(这对我来说似乎很奇怪)。

我读通过追求上的文档,我看到一个selectElement在功能上Util,但没有在任何地方我看到的东西,让我的选择id。

我可以使用getElementById :: ElementId -> NonElementParentNode -> Eff () (Nullable Element)来获取Element,但我不知道如何将其Element变成HTMLElement.

Pursuit 中的类型搜索功能也缺乏,所以我为这个幼稚的问题道歉。

purescript halogen

2
推荐指数
1
解决办法
800
查看次数

翻转功能有什么作用?

我是 purescript 的新手。这是我正在学习的Leanpub-purescript一书。我无法理解翻转功能是什么。这类似于交换概念吗?

> :type flip
forall a b c. (a -> b -> c) -> b -> a -> c
Run Code Online (Sandbox Code Playgroud)

这意味着a value goes to b, then b to a, then c is itself??. 我很震惊。请解释翻转概念,如果我指的书不好,建议一些其他材料

purescript

2
推荐指数
1
解决办法
580
查看次数

将PureScript函数编译为未经验证的JavaScript函数

以下PureScript函数:

add :: Number -> Number -> Number
add a b = a + b 
Run Code Online (Sandbox Code Playgroud)

...编译成JavaScript如下:

var add = function (a) {
    return function (b) {
        return a + b;
    };
};
Run Code Online (Sandbox Code Playgroud)

我想在iOS上使用JavaScriptCore框架调用此函数,这使得它比它需要的更复杂.有没有办法编译到未计算的函数?

javascript currying purescript

2
推荐指数
1
解决办法
110
查看次数

高等级多态性中"秩"的起源是什么?

我正在寻找类似于更高类型多态性的解释,其中一种类型只是一组谓词.

haskell purescript

2
推荐指数
1
解决办法
110
查看次数

如何显示 PureScript 列表中的每个项目

纯脚本列表中是否有 foreach 方法?foreach 方法获取列表的每个项目并返回一个单位。

它是打印列表中每个项目的好方法。

编辑:我正在尝试下面建议的 traverse 方法,但出现错误

import Data.Traversable (traverse)
removeDuplicate :: AddressBook -> AddressBook 
removeDuplicate = nubBy (\a b -> a.firstName == b.firstName && a.lastName == b.lastName)    
let dedup = removeDuplicate addressBook  
traverse (\a -> log (showEntry a)) dedup

Compiling Main
Error found:
in module Main
at src/Main.purs line 73, column 3 - line 73, column 49

  Could not match type

    List Unit

  with type

    Unit


while trying to match type Eff
                             ( console :: CONSOLE
                             | t1 …
Run Code Online (Sandbox Code Playgroud)

purescript

2
推荐指数
2
解决办法
823
查看次数

虚无和荒谬的工作如何

Void州的源代码:

newtype Void = Void Void

instance showVoid :: Show Void where
    show = absurd

absurd :: forall a. Void -> a
absurd a = spin a
    where
    spin (Void b) = spin b
Run Code Online (Sandbox Code Playgroud)

它似乎Void是一个无限递归类型,absurd而是一个无限递归函数.我尝试show ((unsafeCoerce "lol") :: Void)在REPL中运行,它很快就进入了一个无限循环.

困扰我的是类型签名absurd :: forall a. Void -> a.签名如何有效?编译器是否识别无限递归函数并允许它们具有任何返回类型,知道如果调用它们将永远不会实际终止?不仅具有absurd = unsafeCoerce相同的效果吗?

purescript

2
推荐指数
1
解决办法
137
查看次数

在 Purescript 中为 NonEmpty 编写 Functor 实例与编写 Eq 实例

我目前正在通过阅读Purescript by Example书来学习 Purescript (迄今为止我发现的唯一涵盖该语言的资源之一)。

我正在尝试实现第 6.7 节(实例依赖性)中的练习,但我无法理解以下编译器错误:

在此处输入图片说明

我已经为数据类型实现了 Semigroup 和 Eq 实例,data NonEmpty a = NonEmpty a (Array a)如下所示:

instance eqNonEmpty :: Eq a => Eq (NonEmpty a) where
  eq (NonEmpty h1 t1) (NonEmpty h2 t2) = h1 == h2 && t1 == t2


instance semigroupNonEmpty :: Semigroup (NonEmpty a) where
  append (NonEmpty h1 t1) (NonEmpty h2 t2) = NonEmpty h1 (t1 <> [h2] <> t2)

Run Code Online (Sandbox Code Playgroud)

但是当我尝试以同样的方式实现 Functor 实例时,我得到了上面的错误。似乎有效的是:

instance functorNonEmpty :: Functor NonEmpty where …
Run Code Online (Sandbox Code Playgroud)

types class functor purescript

2
推荐指数
1
解决办法
179
查看次数