我有多个“线程”,它们与一起运行forkIO。而且我需要处理相互访问,这是典型的关键部分/锁,因为它们将共享相同的内容Map:其中一些将对其进行修改,另一些将对其进行读取。Haskell中使用forkIOAPI,模块,库创建线程的关键部分是什么?
编辑:和所有这一切下 Scotty
该代码的作用是什么?是someMap(的::Data.Map.Strict.Map)对象的副本是否由myMap引用或仅作为引用?我的意思是,在我阅读后可以someMap更改(通过另一个线程)readIORef吗?像C的易失性...可能吗?我希望它是复制/快照,因此任何更改都不会影响我someMap或...?
do
....
someMap <- readIORef myMap
....
Run Code Online (Sandbox Code Playgroud) 我有一个类似的电话someFunc @'SomeX @'SomeY ...。是否有一些别名语法可以使其更短?就像是:
type ??? = @'SomeX @'SomeY
someFunc @??? ...
Run Code Online (Sandbox Code Playgroud)
?
模式匹配是基于Eq实例的,对吗?我看到Data.Set.Set实现Eq和
>S.fromList [] == S.fromList [1,2]
False
>S.fromList [1,2] == S.fromList [2,1]
True
Run Code Online (Sandbox Code Playgroud)
哪个是对的。那为什么
case S.fromList [1,2] of mempty -> True
Run Code Online (Sandbox Code Playgroud)
返回真?(实际上它总是评估为 true)。我的意思是这样的匹配是错误的,我们应该将其用作S.null谓词,但无论如何:它是如何工作的True?
如何解释第三个结果?为什么返回的列表为空?
>[Just 1, Just 2, Nothing, Just 3]^..folded._Just
[1,2,3]
>"1"^?_Show::Maybe Int
Just 1
>["1", "2", "x"]^..folded._Show :: [Maybe Int]
[]
Run Code Online (Sandbox Code Playgroud)
_Just和_Show是棱镜:
>:t _Just
_Just :: Prism (Maybe a) (Maybe b) a b
>:t _Show
_Show :: (Read a, Show a) => Prism' String a
Run Code Online (Sandbox Code Playgroud)
但_Show并不像我预期的那样工作。[Just 1, Just 2]如何用透镜/棱镜得到结果?当然,我可以使用to readMaybe,但我想我可以使用现有的 prism 而不是 helper to。
FreePascal,Delphi模式。经过一些实验,我发现该代码已编译,FPC告诉我类过程必须是“静态的”。但是我的问题是:那为什么运算符Equal不需要“静态”并且可以正常编译?我也无法理解“类”过程和“类”与“静态”有什么区别(例如,在Python中,classmethod您获取参数-引用该类,在staticmethod-中您没有此类参数)。
type TPos = record
FLine: Word;
FPos: Word;
class procedure Init(out a: TPos); static;
class operator Equal(a, b: TPos): Boolean;
end;
Run Code Online (Sandbox Code Playgroud)
PS。我设置“ delphi”标签的原因是:1)它是在delphi模式下编写的2)因为我找到了与Delphi相同的文档:关于类和静态关键字。
我读了这篇文章,但无法理解签名:
type FuncWithOneObjectArgument<P extends { [x: string]: any }, R> = (props: P) => R;
Run Code Online (Sandbox Code Playgroud)
这是什么{ [x: string]: any}意思?我认为它是一本字典,其中包含any类型的值和......什么?列表?弦?!这是什么x意思?我尝试删除,x但它导致语法错误...如何读取类型?
考虑这些类型:
data A = A { a :: Int }
data B = B { a :: Int } -- a again!
data C = C1 A | C2 B
Run Code Online (Sandbox Code Playgroud)
有没有办法a从C物体上返回一些镜头(棱镜?)Int而不返回Maybe Int?因为使用模式匹配(好吧,或使用RecordWildCards):
case c of
C1 c1 -> a c1
C2 c2 -> a c2
Run Code Online (Sandbox Code Playgroud)
我可以得到Int,但是有了镜头/棱镜,我想我永远都会得到Maybe Int。是否可以用镜头来完成?我的直觉是镜头不知道a访问器的“决定论” C,它不可能Maybe......
我有:
class C a where
anyC :: a
data D = D String|AnyD deriving (Eq, Show, Data)
instance C D where
anyC = AnyD
Run Code Online (Sandbox Code Playgroud)
我想编写:: C a => a将创建的函数D someString.我会打电话anyC给a谁AnyD.而下一步是创建D someString从AnyD.在大多数现代语言中,它很容易.对于Haskell,我找到了本教程,并在那里看到fromConstrB.所以,目标似乎可行,但是......我遇到了文章看错的问题:我不能用Chris的方式构造任何东西,因为构造函数参数必须是代数类型和代码,如fromConstr (toConstr (1 :: Int))返回错误Exception: Data.Data.constrIndex is not supported for Prelude.Int, as it is not an algebraic data type..同样的是String,所以我无法将someString我的构造函数传递给我!如何解决它?
如何使用 Haskell 转义字符串/文本中的特殊字符?首选方法是使用标准解决方案(“标准”函数、库)。所以,
"aaa\nbbb\r" must be transformed to "aaa\\nbbb\\r"
Run Code Online (Sandbox Code Playgroud)
我发现只有完全过时的 JSONb 库依赖于旧的 ByteString,所以我无法构建它。还有 MissingH 但它是任何东西的集合。是否有任何标准解决方案,它看起来非常有用?
我有一个错误Not a data constructor: "%:":
data KV = forall a. Show a => (%:) Text a
Run Code Online (Sandbox Code Playgroud)
有趣的是,但是:%作为数据构造函数就可以了!%%再也不好了。但是%%可以作为infix函数。为什么将其视为错误?这些变体之间有什么区别?
当我阅读/显示时,String我会得到/预期要引用的结果。如果我想省略引号,则可以实现某些类型,例如:
newtype Atom = Atom String deriving (Eq, Ord)
instance Read Atom where ...
instance Show Atom where ...
Run Code Online (Sandbox Code Playgroud)
但是我的问题是:这样的类型可能已经存在于库中的某个位置吗?我只是找到了一些,Data.Atom但看起来有些不同(XML等)。
haskell ×10
haskell-lens ×2
delphi ×1
do-notation ×1
freepascal ×1
immutability ×1
io-monad ×1
ioref ×1
pascal ×1
typescript ×1