我的教科书中一个更正的测验是问我有多少个f参数是严格的,f是:
f x 0 z = x == z
f x y z = x
Run Code Online (Sandbox Code Playgroud)
我最初的想法是所有f的参数都被认为是严格的,因为y正在评估它是否等于0,并且x和z比较它们是否相等。然而答案是 onlyx和yare strict 。
关于原因的任何线索?
我一直在练习匿名函数并得到以下结果:
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)
知道为什么吗?
如果这个问题真的很简单,我很抱歉,但我一直在用我制作的一段随机代码搞砸了,我很好奇为什么下面的代码不能编译:
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]。为什么是这样?毕竟我将这些整数提供给我的匿名函数以获取浮点数列表。
我在编译以下内容时遇到问题:
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)
为这个微不足道的问题道歉,但我不明白为什么它会失败
我无法理解以下原因:
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?
我制作了以下类来在不同的温度类型之间进行转换:
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) 我只是在学习数据,我试图用它来定义复数。
到目前为止,我有以下几点:
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,以及放置中间的运营商。
有任何想法吗?