小编Lan*_*ard的帖子

如何在Haskell中将参数化类型序列化为JSON?

假设您有一个简单的类型,并希望使用Aeson将其序列化为JSON.这是基本设置:

{-# LANGUAGE DeriveGeneric #-}

import Data.Aeson (ToJSON)
import Data.Aeson (encode)
import GHC.Generics

data Spotting = Spotting {
  state :: String,
  bird :: String
} deriving (Show, Generic)

instance ToJSON Spotting
Run Code Online (Sandbox Code Playgroud)

现在说,除了birdstate字段之外,您还希望允许用户传入额外/自定义元数据.对于鸟类的观察,也许这是气温,鸟类的密度,潮汐的位置......可能是任何事情,我们事先并不知道.

通过查看Haskell中Twitter API等示例,您似乎想要像这样构建它:

data Spotting meta = Spotting {
  state :: String,
  bird :: String,
  meta :: meta
} deriving (Show, Generic)

instance ToJSON meta => ToJSON (Spotting meta)
Run Code Online (Sandbox Code Playgroud)

根据我的理解,到目前为止,这是一个参数化类型.现在的目标是创建一个从该对象中创建一些JSON的简单方法.所以我们定义一个这样的函数:

spotting bird state meta = encode $ Spotting { …
Run Code Online (Sandbox Code Playgroud)

haskell aeson

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

如何在Assembly Works中调用带有大量args的函数

这是一组示例函数,第一个是20个args,第二个是2:

int a(int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int n9, int n10, int n11, int n12, int n13, int n14, int n15, int n16, int n17, int n18, int n19, int n20) {
    return n1 * n2 * n3 * n4 * n5 * n6 * n7 * n8 * n9 * n10 * n11 * n12 * n13 * n14 * n15 * n16 * n17 * n18 * …
Run Code Online (Sandbox Code Playgroud)

c linux assembly x86-64 function

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

如果你可以在浏览器中访问低于 TCP 的级别

我正在学习网络协议,发现接近最低级别的是原始以太网协议:

以太网:这是使用您的 MAC 地址将数据发送到本地网络上的另一台计算机的基本协议。这是其余所有内容的构建块,因为如果您想与外界通信,则需要将数据发送到路由器。

其之上是互联网协议 (IP),其中 TCP 和 UDP 就是示例。TCP 之上是 HTTP,或者可以在 SSL 之上放置 HTTP(因此 HTTPS)。

浏览器似乎只允许您深入到 IP 级别(用于正常消息传递连接的 TCP,用于视频等内容的 UDP)。但我想知道是否有可能比浏览器中的更低。如果没有,那么想知道为什么不。如果是这样,那么可能是一个例子。

browser ip networking tcp ethernet

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

在终端键入`node`时运行的代码

我正在努力了解shebang是如何工作的,并想知道当你node在终端提示符下输入时会发生什么.想知道它是否main在某处调用某个c函数.我只了解基础知识,已经使用了一段时间的节点.shebang #!/usr/bin/env node以某种方式读取节点可执行文件,我不确定它是什么或在哪里,以及它从什么开始.然后有代码实际上评估表达式node并将其指向shebang,但这可能太复杂而无法询问.

c bash terminal node.js

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

如何在 Swift 字符串中写入所有 ASCII 字符

尝试找到最短/最紧凑的方法将 Swift 中的 ASCII 字符写成单个字符串。例如,在 JavaScript 中,您可以将'\\x00'ASCII 中的 0 等价于十进制,也可以编写'\\0,即短 2 个字符。因此,如果您有很多这些字符,文件大小就会缩小 2 倍。

\n\n

想知道如何在 Swift 中将 ASCII 字符 0-31 和 127 写入单个字符串中,以便将它们最小化。在 JavaScript 中,这看起来像这样:

\n\n
'\\0...\\33abcdef...\\127\xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd...'\n
Run Code Online (Sandbox Code Playgroud)\n

string ascii swift

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

如何评估Haskell中的一些"数据"定义

我正在看一些例子来看看更复杂的data定义是如何工作的,例如......

data DualMap a b = DualMap (Map a b) (Map b a)
data Store s a = Store (s -> a) s deriving Functor
data Fold a b = forall x . Fold (x -> a -> x) x (x -> b)
data Pair a b = Pair !a !b
type Rule m a = (m -> a) -> a
data RingZipper a = RingZipper {
    before :: V.Vector a,
    focus  :: a,
    after  :: V.Vector a …
Run Code Online (Sandbox Code Playgroud)

haskell

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

在Swift中将类型动态传递给MemoryLayout <T>

我想创建一个像这样的函数:

func getStride(_ type: T.Type) {
  return MemoryLayout<type>.stride
}
Run Code Online (Sandbox Code Playgroud)

但这没用

我希望能够这样称呼它:

getStride(Bool) //=> stride value
Run Code Online (Sandbox Code Playgroud)

如果不是那样,那么也许是这样:

getStride(Bool.self)
Run Code Online (Sandbox Code Playgroud)

想知道是否有可能这样。

swift

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

如果x86程序集中有任何暂停/睡眠或事件

我想知道在x86-64的汇编级别上是否有任何东西可以让您进入睡眠/ 等待状态,以便在等待完成之前不执行任何指令。我已经看到了WAIT和PAUSE指令,但是不确定它们是否相关。

我会这样想:

start:
  wait 123, oninterrupt ; 123 milliseconds
  ; then it will go here after that time
oninterrupt:
  ; ctrl-c pressed, now exit
Run Code Online (Sandbox Code Playgroud)

同样,我想知道x86中是否有事件挂钩/处理程序。因此,如果有人按CTRL + C,将有一个中断事件发送到某个地方的程序集,您可以在其上运行“退出”代码。我想一个事件处理程序可以这样写在程序集x86中:

start:
  int 10, onctrlc ; register handler for made up event
  ; ... more instructions evaluate right after
onctrlc:
  ; control+c pressed, now exit
Run Code Online (Sandbox Code Playgroud)

但是我不仅在考虑CTRL + C,而且还在考虑任何事件(对此我不太了解)。我在C中看到了这个微小的事件循环库,不确定是否可以通过简单的汇编指令来完成。诸如键盘事件,套接字事件,文件事件,其他事件之类的东西我都不知道会是什么样。

同样,这将以常规用户身份在操作系统上运行。但是,知道如何为特权用户做到这一点很高兴。而且也不关心如何使用linux C函数或syscalls来实现,到目前为止,我知道如何做到这一点。

assembly sleep x86-64 event-loop instructions

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

Unicode中阿拉伯字母的结构

我在维基百科上找到了两个不同的阿拉伯字母“版本”。第一个示例似乎将 3 个子组件合二为一:

\n\n
"\xd9\x80\xd9\x85\xd9\x80".split(\'\').map(x => x.codePointAt(0).toString(16))\n[ \'640\', \'645\', \'640\' ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

在本页找到这个“m medial”字母给我这个:

\n\n
\xef\xbb\xa4\nfee4\n
Run Code Online (Sandbox Code Playgroud)\n\n

代码点 640 和 645 是“阿拉伯语 tatwheel”\xd9\x80和“阿拉伯语字母 meem” \xd9\x85。有没有搞错?这是如何运作的?到目前为止,我在 Unicode 阿拉伯语的信息中没有看到这些字形是如何“组成”的。为什么是由这些部分组成的呢?所有字形的结构是否都有一个模式?(维基百科第一个页面上的所有字形都很相似,但第二个页面上的所有字形都是一个代码点)。在哪里可以找到有关如何有效解析阿拉伯语(或任何其他语言)字符的信息?

\n

string unicode encoding arabic internationalization

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

如何在 Haskell 中显示 100% 完全无糖功能?

例如,说putStrLn "one" >> putStrLn "two"。如果我这样做:info >>,我会看到:

type Monad :: (* -> *) -> Constraint
class Applicative m => Monad m where
  ...
  (>>) :: m a -> m b -> m b
  ...
    -- Defined in ‘GHC.Base’
infixl 1 >>
Run Code Online (Sandbox Code Playgroud)

我想看看表达式putStrLn "one" >> putStrLn "two"是什么,替换>>为这个定义。但不仅仅是这个函数表达式,任何函数表达式,如何查找和打印无糖版本。

haskell

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