我正在玩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)的实例"
我确定我错过了什么,但我不知道是什么.
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 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-halogen可以通过它来选择一个元素id,或者我是否需要自定义它的角色(这对我来说似乎很奇怪)。
我读通过追求上的文档,我看到一个selectElement在功能上Util,但没有在任何地方我看到的东西,让我的选择id。
我可以使用getElementById :: ElementId -> NonElementParentNode -> Eff () (Nullable Element)来获取Element,但我不知道如何将其Element变成HTMLElement.
Pursuit 中的类型搜索功能也缺乏,所以我为这个幼稚的问题道歉。
我是 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函数:
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框架调用此函数,这使得它比它需要的更复杂.有没有办法编译到未计算的函数?
纯脚本列表中是否有 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) 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 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) purescript ×10
class ×1
currying ×1
functor ×1
halogen ×1
haskell ×1
javascript ×1
reader-monad ×1
types ×1