小编San*_*zor的帖子

具有严格参数的函数

我的教科书中一个更正的测验是问我有多少个f参数是严格的,f是:

f x 0 z = x == z
f x y z = x
Run Code Online (Sandbox Code Playgroud)

我最初的想法是所有f的参数都被认为是严格的,因为y正在评估它是否等于0,并且xz比较它们是否相等。然而答案是 onlyxyare strict 。

关于原因的任何线索?

haskell

7
推荐指数
2
解决办法
393
查看次数

匿名函数中的参数

我一直在练习匿名函数并得到以下结果:

takeWhile' :: (a -> Bool) -> [a] -> [a]
takeWhile' f xs = foldl (\x y z -> if (f x) && z then x : y else y) xs [] True
Run Code Online (Sandbox Code Playgroud)

这基本上是对 Haskell 中已有的 takeWhile 函数的重写。

对于那些不知道的人,takeWhile 函数接受一个列表和一个函数,并返回一个新列表,其中包含原始列表中满足该函数的每个元素,直到其中一个返回 false。

从我的角度来看,一切似乎都是正确的,我有 3 个参数 xy 和 z 准备在我的匿名函数中使用,x 是数字列表,y 是我将插入每个元素的空列表,z 基本上是一个debouncer 以便如果其中一个元素不符合要求,我们就不再插入。

然而 Haskell 给了我以下错误:

"Occurs check: cannot construct the infinite type: a ~ Bool -> [a]"
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

lambda haskell anonymous-function

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

浮动问题

如果这个问题真的很简单,我很抱歉,但我一直在用我制作的一段随机代码搞砸了,我很好奇为什么下面的代码不能编译:

test::Floating a => Int -> [a]
test x = map(\y -> (y * abs(cos(y)))) [0..x]
Run Code Online (Sandbox Code Playgroud)

我试图理解大多数类型类,并且我想到了使用 Floating,因为我们使用的是余弦。该函数的目标是使用以下函数制作 0 到 x 的列表:\y -> (y * abs(cos(y)))

然而,编译器抱怨 x 的类型(“无法将类型 'a' 与 'Int' 匹配”),说它需要一个类型 [a] 但收到 [Int]。为什么是这样?毕竟我将这些整数提供给我的匿名函数以获取浮点数列表。

haskell

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

无法将矩阵相加

我在编译以下内容时遇到问题:

data Matrix = Matrix [[Float]] deriving (Eq)

aditionMat :: Matrix -> Matrix -> Matrix
aditionMat m1 m2 = Matrix $ zipWith (zipWith (+)) m1 m2
Run Code Online (Sandbox Code Playgroud)

我正在定义自定义矩阵数据类型,但我为将两个矩阵相加而制定的方法不起作用。 aditionMat当我给它两个时工作正常,但当我给它两个[[Float]]时不会编译Matrix。错误如下:

无法将预期类型[[Float]]与实际类型匹配Matrix (对于 m1 和 m2)

为这个微不足道的问题道歉,但我不明白为什么它会失败

haskell matrix

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

为什么折叠包含 undefined 的列表时 foldr 不返回 undefined?

我无法理解以下原因:

foldr (\x y -> x && y) True [False,undefined,True]
Run Code Online (Sandbox Code Playgroud)

不是给我一个undefined例外。

我的看法是,foldr比较True和列表的最后一个元素,即True,因此返回True并现在将其与undefined. 如果涉及undefined类型,Haskell 是否会忽略该操作?我知道输出是Trueif 在我们拥有的匿名函数x || y(&&),而不是,因为编译器会看到其中一个运算符已经设置为True,但是由于我们正在使用(&&)它,它必须检查两个值是否都已设置到True或其中一人False,对不对?

关于它为什么返回的任何线索False

evaluation haskell list lazy-evaluation fold

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

如何有效地为类型类实例 Eq

我制作了以下类来在不同的温度类型之间进行转换:

data Temp = Kelvin Float | Celsius Float |Fahrenheit Float deriving Show

conversionKelvin:: Temp -> Temp
conversionKelvin (Celsius x) = Kelvin (x + 273.15)
conversionKelvin (Fahrenheit x) = Kelvin((x - 32) * 5/9 + 273.15)
conversionKelvin (Kelvin x) = Kelvin x

conversionCelsius:: Temp -> Temp
conversionCelsius (Kelvin x) = Celsius (x - 273.15)
conversionCelsius (Fahrenheit x) = Celsius((x - 32) * 5/9)
conversionCelsius (Celsius x) = Celsius x

conversionFahrenheit:: Temp -> Temp
conversionFahrenheit (Celsius x) = Fahrenheit (x * …
Run Code Online (Sandbox Code Playgroud)

haskell

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

显示自定义复杂数据类

我只是在学习数据,我试图用它来定义复数。

到目前为止,我有以下几点:

data Complex = Complex Int Int deriving(Eq)

instance Show Complex where
    show Complex a = a -- Not working

instance Num Complex where
    Complex a b + Complex c d = Complex (a+c) (b+d)
    -- etc.
Run Code Online (Sandbox Code Playgroud)

我想要做的是实例 Show 以使程序打印一个像复数一样的字符串,例如:“a + bi”

我理解为什么我写的代码错误,因为 a 是 Complex 类型并且程序需要一个字符串,但我无法理解如何将两个数字分开,然后将“i”添加到 b,以及放置中间的运营商。

有任何想法吗?

haskell complex-numbers

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