我之前检查了一个帖子,似乎明白了.我知道
f :: a -> b -> c
Run Code Online (Sandbox Code Playgroud)
是咖喱的形式
g :: (a, b) -> c
Run Code Online (Sandbox Code Playgroud)
但由于类型签名长于2个箭头,我感到困惑.
myscanr :: (a -> b -> b) -> b -> [a] -> [b]
myscanr op z [] = [z]
myscanr op z (x:xs) = op x (head qs) : qs
where
qs = myscanr op z xs
Run Code Online (Sandbox Code Playgroud)
是(a -> b -> b)和[b]输入和输出?那么中间剩下的是什么?
infixr 5 .++
Run Code Online (Sandbox Code Playgroud)
我在ghci中这样做,它给出了错误消息.
<interactive>:26:10: error:
The fixity signature for ‘.++’ lacks an accompanying binding
Run Code Online (Sandbox Code Playgroud)
我该如何解决?谢谢!
根据我的理解,延迟评估是在将参数传递给函数之前不对其进行求值,但仅在它们的值实际使用时才进行求值.
但是在一个haskell教程中,我看到了一个例子.
xs = [1,2,3,4,5,6,7,8]
doubleMe(doubleMe(doubleMe(xs)))
Run Code Online (Sandbox Code Playgroud)
作者说,命令式语言可能会通过列表一次并复制然后返回.然后它将再次通过列表两次并返回结果.
但是在一种懒惰的语言中,它首先会计算出来
doubleMe(doubleMe(doubleMe(1)))
Run Code Online (Sandbox Code Playgroud)
这将回馈一个doubleMe(1),即2.然后4,最后8.
因此,只有当你确实需要它时,它才能通过列表.
这让我感到困惑.懒惰语言为什么不把整个列表作为一个整体,但拆分呢?我的意思是我们可以在使用它之前忽略列表或表达式.但是我们需要在使用它时评估整个事情,不是吗?
这是一个列表减法示例.
(\\) :: Eq a => [a] -> [a] -> [a]
[] \\ _ = []
xs \\ [] = xs
(x:xs) \\ (y:ys)
| x == y = xs \\ ys
| otherwise = (x : (xs \\ [y])) \\ ys
Run Code Online (Sandbox Code Playgroud)
首先,我不知道Eq代表什么.
其次,应该a是[a]不是在类型类限制?因为输入必须是列表.
sum' :: (Num a) => [a] -> a
sum' xs = foldl (\acc x -> acc + x) 0 xs
Run Code Online (Sandbox Code Playgroud)
没有像这样的模式x:xs.xs是一个清单.在lambda函数中,表达式如何acc + x知道x元素是xs什么?
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
根据我的理解,它需要一个函数f,其中另一个函数(a -> b)作为其参数,返回一个函数f.应用f到a然后返回功能f,并应用f到b.
这是一个例子:
Prelude> (+) <$> Just 2 <*> Just 3
Just 5
Run Code Online (Sandbox Code Playgroud)
但我不太明白它是如何工作的.
我想(+)应该是f,Just 2而且Just 3应该是a和b分别.那是什么(a -> b)?
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
"纯粹"扮演两个角色:
*当你有一个0-ary函数时的退化情况.
*fmap f xs = pure f*xs
我不明白为什么
fmap f xs = pure f <*> xs
Run Code Online (Sandbox Code Playgroud)
我的意思是pure应该采取任何a回报f a.但是做了pure f什么?甚至pure (f <*> xs)对我有意义.
我刚刚设置了iracket.但有些功能似乎不起作用.
(define (f z) (first (rest z)))
(f '(1 2 3))
first: undefined;
cannot reference an identifier before its definition
in module: top-level
internal name: first
context...:
Run Code Online (Sandbox Code Playgroud)
我想知道iracket中有第一个和休息功能吗?
我的ghci版本是8.4.3
我试过了
stack install QuickCheck
Run Code Online (Sandbox Code Playgroud)
已安装某些东西。但是当我输入时import Test.QuickCheck,它会Could not find module ‘Test.QuickCheck’再次显示。我该如何解决?
虽然提供了linalg.lstsq 文档。我还是觉得不太明白,因为不太详细。
x : {(N,), (N,K)} ndarray
最小二乘解。如果 b 是二维的,则解位于 x 的 K 列中。
残差:{(1,), (K,), (0,)} ndarray
残差总和;b - a*x 中每列的欧几里德 2-范数平方。如果 a 的秩 < N 或 M <= N,则这是一个空数组。如果 b 是一维,则这是一个 (1,) 形状的数组。否则形状为 (K,)。
排名:整数
矩阵 a 的秩。
s : (min(M, N),) ndarray
a 的奇异值。
我尝试观察输出。但我只知道排名是2。对于其余的,我不明白为什么会这样。
x = np.array([0, 1, 2, 3])
y = np.array([-1, 0.2, 0.9, 2.1])
A = np.vstack([x, np.ones(len(x))]).T
print(A)
print('-------------------------')
print(np.linalg.lstsq(A, y, rcond=None))
Run Code Online (Sandbox Code Playgroud)
给予
[[0. 1.]
[1. 1.]
[2. 1.]
[3. 1.]] …Run Code Online (Sandbox Code Playgroud) haskell ×8
applicative ×2
currying ×1
fold ×1
functor ×1
numpy ×1
python ×1
quickcheck ×1
racket ×1
typeclass ×1