问题描述
我正在尝试使用 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]]
您可以将其视为包含三个元素的列表。第一个是在a
、b
和c
之间的选择,第二个是在d
和e
之间的选择,第三个是在f
和g
之间的选择h
、i
、sequenceA
和 [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')
。如果您仔细考虑一下可能发生的所有方式,您会发现这正是他们的笛卡尔积!