如何在此函数中将 Traversable 类型解释为 Applicative?

问题描述

我正在尝试使用 haskell 类,并且我发现(至少一些)Traversable 数据结构也是 applicative

当您查看 Traversable 的定义时,您会发现它可以使用 sequenceA 函数进行定义:

sequenceA :: (Traversable t,applicative f) => t (f a) -> f (t a)

由于 list 既是 Traversable 又是 applicative,我确实尝试在列表列表中使用 sequenceA:

-- this thing ...
sequenceA [[0,1],[7,8,9]]

-- is evaluated as [[0,7],[0,8],9],[1,9]]

我得到了 2 个列表的笛卡尔积!

它甚至适用于更多的列表。


这是怎么回事?

这个函数行为背后的直觉是什么?

解决方法

列表应用的直觉是非确定性计算。您可以将带有 n 个元素的 [X] 类型列表视为生成 X 的计算,它绝对是 n 中的一个该列表中包含的 X 选项,但其中任何一个都是可能的。

例如,列表 ['a','e'] 表示可能产生 'a' 或可能产生 'e' 的计算。列表 [-4,4] 可能是询问 16 的平方根的结果。列表 [] 是一个无法正确生成任何值的不确定计算! (例如,询问 -16... 的实数平方根的结果)

在这种解释中,当我们有一个函数列表 fs 和一些值 xs 时,列表 fs <*> xs 是通过应用任何可能得到的所有可能结果的列表fs 中的函数到 xs 中的任何参数。同时,列表 pure x 是确定性计算,它总是只产生一个结果,即 x

所以!如果您有一个嵌套列表,那么有多种替代方法可以考虑它的含义,包括它是一个非确定性计算的列表,或者它是一个生成列表作为其结果的非确定性计算。 sequenceA 函数在这些表示之间传送您:它采用非确定性计算的列表并生成单个非确定性计算,其结果是一个列表。所以:

 [[a,b,c],[d,e],[f,g,h,i]]

您可以将其视为包含三个元素的列表。第一个是在abc之间的选择,第二个是在de之间的选择,第三个是在fg之间的选择hisequenceA[a,c][d,e] 函数将产生一个不确定的列表选择,每个列表的形状与上面的外部列表相同;也就是说,我们在其中选择的每个列表的长度为 3。第一个元素将来自 [f,i];第二个来自 UserPicture.objects.create(user=request.user,picture=image),第三个来自class VideoCamera(object): def __init__(self): self.video = cv2.VideoCapture(0,cv2.CAP_DSHOW) def __del__(self): self.video.release() def create_facial_boundary(self,image,cascadeClassifier,color,emotion): grayScaled = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY) face = cascadeClassifier.detectMultiScale(grayScaled,1.1,10) coords = [] for (x,y,w,h) in face: cv2.rectangle(image,(x,y),(x + w,y + h),color) roi_gray = grayScaled[y : y+h,x: x+w] cv2.putText(image,emotion,y-4),cv2.FONT_HERSHEY_PLAIN,2,(255,255,255)) coords = [x,h] self.update_time() return coords,image def detect_face(self,cascadeClassifier): color = {"green" : (0,145,25)} coords,image = self.create_facial_boundary(image,color["green"],"ExText") image = cv2.flip(image,1) return image def update_time(self): time.sleep(5) def get_user_face(self): success,frame = self.video.read() # img_file = "User-Face.jpg" frame = self.detect_face(frame,cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')) new_frame = cv2.flip(frame,1) _,image = cv2.imencode(".jpg",new_frame) return image def get_user_emotion(): pass def get_frame(self): success,frame = self.video.read() image_flip = cv2.flip(frame,1) ret,jpeg = cv2.imencode('.jpg',image_flip) return jpeg.tobytes() def gen(camera): while True: frame = camera.get_frame() yield (b'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n') def get_image(camera): image = camera.get_user_face() return image def video_feed(request): while True: return StreamingHttpResponse(gen(VideoCamera()),content_type='multipart/x-mixed-replace; boundary=frame') 。如果您仔细考虑一下可能发生的所有方式,您会发现这正是他们的笛卡尔积!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...