我想要一段代码,如果它不存在,则在一个范围内创建一个变量,如果它已经存在,则访问该变量.我需要它是相同的代码,因为它将被多次调用.
但是,Tensorflow需要我指定是否要创建或重用变量,如下所示:
with tf.variable_scope("foo"): #create the first time
v = tf.get_variable("v", [1])
with tf.variable_scope("foo", reuse=True): #reuse the second time
v = tf.get_variable("v", [1])
Run Code Online (Sandbox Code Playgroud)
我怎样才能弄清楚是否自动创建或重用它?即,我希望上面两个代码块相同并运行程序.
在Coq中,假设我有一个f在(g x)上匹配定义的fixpoint函数,我想g x = ...在证明中使用form()中的假设.以下是一个最小的工作示例(实际上f,g会更复杂):
Definition g (x:nat) := x.
Fixpoint f (x:nat) :=
match g x with
| O => O
| S y => match x with
| O => S O
| S z => f z
end
end.
Lemma test : forall (x : nat), g x = O -> f x = O.
Proof.
intros.
unfold f.
rewrite H. (*fails*)
Run Code Online (Sandbox Code Playgroud)
该消息显示Coq被卡住的地方:
(fix f (x0 : …Run Code Online (Sandbox Code Playgroud) 假设我的镜头at _需要一些Maybe a:
import Data.Map as M
m = M.fromList [(1,(2,3))]
--set 2nd element
m ^. at 1 .~ Just (4,5)
--gives fromList [(1,(4,5))]
m ^. at 1 .~ Nothing
--gives fromList ()
Run Code Online (Sandbox Code Playgroud)
现在假设我想用另一个镜头来构图.这个镜头返回的事实Maybe a阻止我直接这样做.
m ^. at 1 . _2 .~ Just 4
--error
-- I want to get M.fromList [(1,(2,4))]
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?
Haskell似乎没有识别我的类型注释.为什么是这样?
这里Runner是一个函数的包装器,具有c的默认起始值("连续").在rmap中,我希望c有一个默认的"起始"值(例如,如果c是[a],我会让该值为[]).这里当然不方便(也许这是不好的做法,随意提出更好的方法)是需要类型注释,因为rmap的域不涉及类型c.但是,为什么我不能通过类型注释来解决这个问题呢?
data ExitCode = Fail | OK | Success deriving (Eq, Show)
data Runner a b c = Runner {cont ::c
, fun :: (a, c , ExitCode) ->(b, c, ExitCode)}
class Pointed a where
point :: a
rmap:: (Pointed c) => (a->b) -> Runner a b c
rmap f = Runner (point::c) (\(x,y,z) -> (f x,y,z))
Run Code Online (Sandbox Code Playgroud)
错误如下.(似乎将c解释为c1.)
Could not deduce (Pointed c1) arising from a use of `point'
from the context (Pointed c)
bound by the type signature …Run Code Online (Sandbox Code Playgroud) 我想创建一个实例声明,但free类型变量不是最后一个变量.例如,我有一个类声明
class Poppable m where
tryPop :: m a -> Maybe (a, m a)
Run Code Online (Sandbox Code Playgroud)
现在我想让Q.PSQ(优先级队列)成为Poppable的一个实例.具体来说,我想要这样的东西:
instance (Ord p) => Poppable (\a -> Q.PSQ a p) where
tryPop = fmap (first Q.key) . Q.minView
Run Code Online (Sandbox Code Playgroud)
但是,这不是合法的Haskell代码.如果切换到PSQ的参数顺序,那么我就没有问题了:
instance (Ord p) => Poppable (Q.PSQ p) where
tryPop = fmap (first Q.key) . Q.minView
Run Code Online (Sandbox Code Playgroud)
如何切换实例声明的参数顺序?
现在我可以使用newtype包装PSQ:
newtype PSQ'' a b = PSQ'' (Q.PSQ b a)
Run Code Online (Sandbox Code Playgroud)
然而这对我来说似乎很笨重,因为我必须不断地包装/打开它.有没有更简单的方法?
*
我尝试使用数据/类型系列,但都给出了错误.
(1)使用数据族声明:
data family PSQ' a b
data instance PSQ' a b = PSQ b a
instance (Ord …Run Code Online (Sandbox Code Playgroud) 考虑Haskell中的以下两个表达式:
foldl' (>>=) Nothing (repeat (\y -> Just (y+1)))
foldM (\x y -> if x==0 then Nothing else Just (x+y)) (-10) (repeat 1)
Run Code Online (Sandbox Code Playgroud)
第一个需要永远,因为它试图评估无限表达
...(((Nothing >>= f) >>= f) >>=f)...
Run Code Online (Sandbox Code Playgroud)
而Haskell只会尝试从内到外进行评估.
然而,第二个表达式立即给出了Nothing.我一直认为foldM只是使用(>> =)进行折叠,但是它会遇到同样的问题.所以它在这里做了一些更聪明的事情 - 一旦它命中了它就知道停止了.foldM实际上如何工作?
我希望能够覆盖Haskell中记录的Eq和Show的默认定义.例如,假设我想在第一个条目相等的情况下将有序对定义为相等.但是当我写这个:
data Two = Two {a::Int, b::Int}
instance Eq Two where
x == y = ((a x) == (a y))
Run Code Online (Sandbox Code Playgroud)
哈斯克尔抱怨道
Ambiguous occurrence `=='
It could refer to either `TestOverride.==',
defined at TestOverride.hs:15:3
or `Prelude.==',
imported from `Prelude' at TestOverride.hs:7:8-19
(and originally defined in `GHC.Classes')
Run Code Online (Sandbox Code Playgroud)
有什么问题?