我正在阅读标准haskell库的执行代码(^):
(^) :: (Num a, Integral b) => a -> b -> a
x0 ^ y0 | y0 < 0 = errorWithoutStackTrace "Negative exponent"
| y0 == 0 = 1
| otherwise = f x0 y0
where -- f : x0 ^ y0 = x ^ y
f x y | even y = f (x * x) (y `quot` 2)
| y == 1 = x
| otherwise = g (x * x) ((y - 1) `quot` 2) x …Run Code Online (Sandbox Code Playgroud) 所以我想知道是否有可能只在函数范围内设置一次静态变量.例如,考虑这个功能:
void projectPointIntoPlane(const Affine3f& plane2xy, Vector3f& p)
{
static Matrix3f P;
P << Vector3f::UnitX(), Vector3f::UnitY(), Vector3f::Zero();
p = plane2xy.inverse() * P * plane2xy * p;
}
Run Code Online (Sandbox Code Playgroud)
我想只设置一次P而不是每个函数调用,我怎么能得到这个?
说我有功能
g :: a -> b, h :: a -> c
Run Code Online (Sandbox Code Playgroud)
和
f :: b -> c -> d.
Run Code Online (Sandbox Code Playgroud)
是否可以编写该功能
f' :: a -> a -> d
Run Code Online (Sandbox Code Playgroud)
由...给出
f' x y = f (g x) (h y)
Run Code Online (Sandbox Code Playgroud)
点自由风格?
可以写这个功能
f' a -> d, f' x = f (g x) (h x)
Run Code Online (Sandbox Code Playgroud)
通过设置点自由风格
f' = (f <$> g) <*> h
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何做更一般的情况.
假设我有一个类型类,对于这个类型类的每个实例我都有一个函数
f :: [Bool] -> Maybe (a, [a])
Run Code Online (Sandbox Code Playgroud)
我怎么称呼f?更准确地说,如果b是此类型类中的另一种类型,我如何指定我的意思是来自a的实例的f而不是来自b的实例?
我正在编写一个函数,将bool列表的列表无意义地映射到bool列表中.这是我的代码:
y=[False| y<-[0..]]
encode :: [[Bool]] -> [Bool]
encode x:xs = (zip1 x y):True:True:(encode xs)
encode []=[]
Run Code Online (Sandbox Code Playgroud)
zip1函数只需要两个列表并将它们交替写入新列表.
我收到错误消息
模式中的解析错误:编码
为什么我收到此错误消息?
我试着写一个小程序,可以检查给定的数字是否出现在树中.这是我的代码:
import Prelude
data Tree = Node Int [Tree]
Tree happytree = Node 5 [Node 1 [Node 6 []],Node 8 [],Node 2 [Node 1 [],Node 4 []]]
contains1 :: [Tree] -> Int -> Bool
contains1 [] x = False
contains1 (a:as) x = contains a x || contains1 as x
contains :: Tree -> Int -> Bool
contains (Node x []) y = x==y
contains (Node x as) y = x==y || contains1 as y
Run Code Online (Sandbox Code Playgroud)
我收到错误消息
Not in scope: data …Run Code Online (Sandbox Code Playgroud)