我试图在应用索贝尔过滤后将图像转换回灰度。我有以下代码:
import numpy as np
import matplotlib.pyplot as plt
import cv2
image = cv2.imread("train.jpg")
img = np.array(image, dtype=np.uint8)
#convert to greyscale
img_grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#remove noise
img_smooth = cv2.GaussianBlur(img_grey, (13,13), 0)
sobely = cv2.Sobel(img_smooth,cv2.CV_64F,0,1,ksize=9)
Run Code Online (Sandbox Code Playgroud)
我想使用 ConvertScaleAbs() 函数将图像转换sobely回灰度。
我知道该函数采用源(要转换为灰度的图像)和目标数组作为参数,但我不确定创建目标数组的最佳方法是什么。
任何见解表示赞赏。
我有以下代码:
{-# LANGUAGE TypeFamilies #-}
type family Times (a :: Nat) (b :: Nat) :: Nat where
Times Z n = Z
Times (S m) n = Plus n (Times m n)
Run Code Online (Sandbox Code Playgroud)
我知道类型家族允许您在类型级别上编写函数。但是,对于上面的代码,我知道(a :: Nat) (b :: Nat)这是传递给函数的两个参数的类型Times。
但是我不明白决赛:: Nat之后(a :: Nat) (b :: Nat)意味着什么。任何见解都表示赞赏。
我正在做 Ivan Bratko 的“人工智能 Prolog 编程”中的练习。练习中说:
定义运算符“if”、“then”、“else”和“:=”,以便以下成为合法术语:
如果 X > Y 则 Z := X 否则 Z := Y
选择优先级,使“if”成为主要函子。
我无法确定运算符“then”和“else”中哪一个应该具有较低的优先级(并且绑定更强)。我对这个问题的回答是:
:- op(900, fx, if).
:- op(800, xfx, else).
:- op(700, xfx, then).
:- op(600, xfx, :=).
Run Code Online (Sandbox Code Playgroud)
(书中还指出“>”运算符的优先级为700)。
我认为“then”会比“else”绑定更强,但是这个练习的答案却另有说明:
:- op(900, fx, if).
:- op(800, xfx, then).
:- op(700, xfx, else).
:- op(600, xfx, :=).
Run Code Online (Sandbox Code Playgroud)
我不确定使“else”的优先级低于“then”背后的理由。任何见解都将不胜感激。
我有以下证明,假设A和B,可以得出A?B:
我正在尝试使用Haskell风格的语法对来键入lambda演算中找到与此证明等效的程序。假定a:A和b:B。
将这种证明转换为类型,可以得出:假设x ::(B,A),则想构造(A,B)。
我为此陷入两个选择之间:
(1)(?x。(x,x))(b,a)
(2)((b,a),(b,a))
我相信选项(2)是正确的,因为它不是被证明的暗示(转换为函数)。但是,我不确定我的推理是否正确。由于我们正在根据类型考虑此证明,因此x ::(B,A)在哪里更合适(1)?任何见解都表示赞赏。
我正在从“了解Haskell来取得良好成就!”中学习高阶函数!由Miran Lipovaca撰写。我知道flip函数接受一个函数并返回一个像原始函数一样的函数,但是前两个参数被翻转。
我不完全了解带有map函数的以下示例的工作方式。
ghci> map (flip subtract 20) [1,2,3,4]
[19,18,17,16]
Run Code Online (Sandbox Code Playgroud)
Map接受一个函数并将其应用于列表的每个元素,从而生成一个新列表。但是由于函数映射是带参数的翻转subtract 20 [1,2,3,4],因此生成的函数是20 subtract [1,2,3,4]吗?
我认为这是不正确的,因为只有在您键入时才会生成诸如19之类的值subtract 1 20。我不确定在上面的示例中减法将如何工作以产生输出列表。
我正在尝试在 Haskell 中创建自己的自定义数据类型。
我有以下数据类型:
type Length = Integer
type Rotation = Integer
data Colour = Colour { red, green, blue, alpha :: Int }
deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个自定义数据类型,它可以是上述数据类型之一。我有以下几点:
data Special
= L Length
| R Rotation
| Col Colour
deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)
但是,如果我有数据类型的实例,我希望能够提取Length,Rotation和Colour值Special。
如果我有:
L length
Run Code Online (Sandbox Code Playgroud)
请问length这里是类型Special或类型的Length?如果length是类型Special有没有办法提取它所以它是类型Length?
例如,下面的代码有效吗?
takeL (x:xs)
| x == (L length) = length
Run Code Online (Sandbox Code Playgroud)
任何见解表示赞赏。
haskell functional-programming pattern-matching algebraic-data-types custom-data-type
我正在学习函数式编程中的副作用(在 Haskell 中),我知道外部效果是在函数外部可观察到的效果,而内部效果从外部是不可见的。
为数据结构分配内存是一种纯粹的操作吗?副作用必须修改某些状态或与调用函数或外部世界进行可观察的交互。在分配数据结构的情况下,您必须调用一些函数(例如 malloc)为其分配内存。但是如果在一个函数内调用这些函数,这对于外部世界来说是不可见的。即使外部世界被修改(因为为数据结构分配了内存),我也不认为分配数据结构是一种副作用,因为它是不可观察的。
但是,我不确定我的推理是否正确。任何见解表示赞赏。
我有以下Haskell表达式:
3 : [40] ++ [50] ++ 5 : [60]
Run Code Online (Sandbox Code Playgroud)
我想知道如何评估此表达式。哪个运算符具有更高的优先级,:或者++?我认为表达式的结果是[3,40,50,5,60],但是我通过以下方式做到了:
3 : [40] ++ [50] ++ 5 : [60]
3 : [40] ++ [50] ++ [5,60]
3 : [40] ++ [50,5,60]
3: [40,50,5,60]
[3,40,50,5,60]
Run Code Online (Sandbox Code Playgroud)
以上是评估表达式的正确方法吗?任何见解都表示赞赏。
我正在guard从“学习Haskell带来的好处!”一书中学习该功能。由Miran Lipovaca撰写。
对于以下示例:
ghci> [1..50] >>= (\x -> guard('7' `elem` show x) >> return x)
[7, 17, 27, 37, 47]
Run Code Online (Sandbox Code Playgroud)
我知道这guard需要布尔值,如果值是True,则guard ()将其放在最小的默认上下文中并成功。如果值为False,则guard产生失败的一元数值。
但是,我不明白在上面的示例中guard是如何工作的,以创建结果列表[7, 17, 27, 37, 47]。x在lambda函数中传递的是1吗?此外,如果('7' `elem` show x)计算结果为False,则不会返回空列表吗?最终结果列表的准确度如何?
我正在“为哈萨克学到伟大的东西!”一书中学习单子。由Miran Lipovaca撰写。我正在阅读Control.Monad.Writer模块如何将Writer w a类型及其Monad实例以及一些有用的函数导出来处理此类型的值。
对于以下代码:
newtype Writer w a = Writer { runWriter :: (a,w) }
Run Code Online (Sandbox Code Playgroud)
我知道atype参数代表某些值的w类型,而type参数代表附加的monoid值的类型。我在说,通过传递正确w和a对Writer类型构造,你会得到一个作家单子的回报,这个单子只有一个函数在runWriter功能?
在书中说,该runWriter函数采用一个包装在新类型中的元组并对其进行包装Writer,从而返回一个简单的元组。但是,类型声明runWriter为runWriter :: (a,w),它不接受任何参数作为输入。如何runWriter获取包装在新类型中的元组并仅返回简单的元组?