小编tre*_*ook的帖子

为什么过滤器基于依赖对?

Idris教程中,用于过滤矢量的函数基于从属对.

filter : (a -> Bool) -> Vect n a -> (p ** Vect p a)
filter f [] = (_ ** [])
filter f (x :: xs) with (filter f xs )
  | (_ ** xs') = if (f x) then (_ ** x :: xs') else (_ ** xs')
Run Code Online (Sandbox Code Playgroud)

但是为什么有必要把这个用于依赖对而不是更直接的东西呢?

filter' : (a -> Bool) -> Vect n a -> Vect p a
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,p必须确定类型,但在我假设的替代方案中,列出p两次列表的冗余被消除.

我实施的天真尝试filter'失败了,所以我想知道它是否存在无法实施的根本原因?或者可以filter'实施,也许filter只是在伊德里斯展示依赖对的一个不好的例子?但如果是这种情况那么在什么情况下依赖对会有用呢?

谢谢!

idris

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

有效地将Foreign.Ptr Word8(或ByteString)转换为UArray Int Word8

我正在使用Network.Pcap(pcap)进行一些网络捕获,并计划使用Net.PacketParsing(网络中心)进行一些检查.为此,看起来我必须将我的数据包解析

Pcap.Callback :: PktHdr -> Ptr Word8 -> IO ()
Run Code Online (Sandbox Code Playgroud)

要么

Pcap.CallbackBS :: PktHdr -> ByteString -> IO ().
Run Code Online (Sandbox Code Playgroud)

并将数据包作为'Ptr Word8'或'ByteString'处理.在数据包解析方面,我有:

Net.Packet.toInPack :: UArray Int Word8 -> InPacket
Run Code Online (Sandbox Code Playgroud)

获得InPacket解析所需的类型.那么,剩下的就是将'Ptr'或'ByteString'转换为'UArray' - 无论是纯粹还是IO.我想我可以拆开ByteString[Word8],并从那里到UArray,但好像必须有一个更好的办法.

我也很关心我选择的库.我过去曾经使用过网络设备并发现它非常好,但它已经老了并且使用了UArray,它本身看起来有点陈旧.因此欢迎提出更好的起点建议.

parsing haskell packet pcap

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

查找匹配的参数参数

是否可以通过类型族或其他方式为任意类型匹配类型参数?

我试图写一个类型函数

type family Match s t a
Run Code Online (Sandbox Code Playgroud)

它采用两个结构,st(假设它们具有相同类型的两个不同参数化,例如Maybe IntMaybe String)和一个将与之匹配的参数。如果找到匹配的参数,类型函数将提供替换项。否则,它将提供原始参数。

Match (Maybe a) (Maybe b) a ~ b
Match (Maybe a) (Maybe b) c ~ c 
Run Code Online (Sandbox Code Playgroud)

我尝试的实现:

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE PolyKinds #-}

import Data.Type.Equality
import Data.Type.Bool

type family Match (s::k) (t::k) (a :: * ) :: * where
  Match (f a :: *) (g b :: *) c = If ((a == c)) b c
Run Code Online (Sandbox Code Playgroud)

找到参数后,该系列显然按计划工作:

>  :t …
Run Code Online (Sandbox Code Playgroud)

haskell type-families

5
推荐指数
0
解决办法
75
查看次数

标签 统计

haskell ×2

idris ×1

packet ×1

parsing ×1

pcap ×1

type-families ×1