<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><link rel="stylesheet" type="text/css" href="style.css" /><script type="text/javascript" src="highlight.js"></script></head><body><pre><span class="hs-comment">-- Copyright 2016 TensorFlow authors.</span><span> </span><a name="line-2"></a><span class="hs-comment">--</span><span> </span><a name="line-3"></a><span class="hs-comment">-- Licensed under the Apache License, Version 2.0 (the "License");</span><span> </span><a name="line-4"></a><span class="hs-comment">-- you may not use this file except in compliance with the License.</span><span> </span><a name="line-5"></a><span class="hs-comment">-- You may obtain a copy of the License at</span><span> </span><a name="line-6"></a><span class="hs-comment">--</span><span> </span><a name="line-7"></a><span class="hs-comment">-- http://www.apache.org/licenses/LICENSE-2.0</span><span> </span><a name="line-8"></a><span class="hs-comment">--</span><span> </span><a name="line-9"></a><span class="hs-comment">-- Unless required by applicable law or agreed to in writing, software</span><span> </span><a name="line-10"></a><span class="hs-comment">-- distributed under the License is distributed on an "AS IS" BASIS,</span><span> </span><a name="line-11"></a><span class="hs-comment">-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span><span> </span><a name="line-12"></a><span class="hs-comment">-- See the License for the specific language governing permissions and</span><span> </span><a name="line-13"></a><span class="hs-comment">-- limitations under the License.</span><span> </span><a name="line-14"></a><span> </span><a name="line-15"></a><span class="hs-pragma">{-# LANGUAGE CPP #-}</span><span> </span><a name="line-16"></a><span class="hs-pragma">{-# LANGUAGE FlexibleContexts #-}</span><span> </span><a name="line-17"></a><span class="hs-pragma">{-# LANGUAGE LambdaCase #-}</span><span> </span><a name="line-18"></a><span class="hs-pragma">{-# LANGUAGE OverloadedStrings #-}</span><span> </span><a name="line-19"></a><span class="hs-pragma">{-# LANGUAGE TypeFamilies #-}</span><span> </span><a name="line-20"></a><span class="hs-comment">{- | Rendering of TensorFlow operations as Haskell functions. The basic type signature generated for each op is: > {constraints} => {mandatory attrs} -> {input tensors} -> {output tensors} where: * @{mandatory attrs}@ is of the form @A_1 -> ... -> A_N@, where each @A@ is an op attribute that doesn't have a default and can't be inferred from other inputs. * @{constraints}@ restrict the type parameters of the input and output tensors (for example: 'TensorType' or 'OneOf'). * @{input tensors}@ is of the form @T_1 -> ... -> T_N@, where each @T@ is of the form @Tensor Ref a@ or @Tensor v a@ (or a list of one of those types), and @a@ is either a concrete type or a (constrained) type variable. * @{output tensors}@ is of the form @(T_1,...,T_N)@ for "pure" ops, and @Build (T_1,...,T_N)@ for "stateful" ops. An op is considered "stateful" if it takes a @Tensor Ref@ or @Tensor v ResourceHandle@ as input, or if it's explicitly marked \"Stateful\" in its @REGISTER_OP@ definition. (If there are no outputs, it is either @ControlNode@ or @Build ControlNode@.) -}</span><span> </span><a name="line-45"></a><span> </span><a name="line-46"></a><span class="hs-keyword">module</span><span> </span><span class="hs-identifier">TensorFlow</span><span class="hs-operator">.</span><span class="hs-identifier">OpGen</span><span> </span><a name="line-47"></a><span> </span><span class="hs-special">(</span><span> </span><a href="TensorFlow.OpGen.html#OpGenFlags"><span class="hs-identifier hs-type">OpGenFlags</span></a><span class="hs-special">(</span><span class="hs-glyph">..</span><span class="hs-special">)</span><span> </span><a name="line-48"></a><span> </span><span class="hs-special">,</span><span> </span><a href="TensorFlow.OpGen.html#docOpList"><span class="hs-identifier hs-var">docOpList</span></a><span> </span><a name="line-49"></a><span> </span><span class="hs-special">,</span><span> </span><a href="TensorFlow.OpGen.html#flagParser"><span class="hs-identifier hs-var">flagParser</span></a><span class="hs-special">)</span><span> </span><a name="line-50"></a><span> </span><span class="hs-keyword">where</span><span> </span><a name="line-51"></a><span> </span><a name="line-52"></a><span class="hs-keyword">import</span><span> </span><span class="hs-identifier">Data</span><span class="hs-operator">.</span><span class="hs-identifier">Foldable</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">toList</span><span class="hs-special">)</span><span> </span><a name="line-53"></a><span class="hs-keyword">import</span><span> </span><span class="hs-identifier">Data</span><span class="hs-operator">.</span><span class="hs-identifier">Maybe</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fromMaybe</span><span class="hs-special">)</span><span> </span><a name="line-54"></a><span class="hs-keyword">import</span><span> </span><span class="hs-identifier">Data</span><span class="hs-operator">.</span><span class="hs-identifier">ProtoLens</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">def</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">showMessage</span><span class="hs-special">)</span><span> </span><a name="line-55"></a><span class="hs-keyword">import</span><span> </span><span class="hs-identifier">Data</span><span class="hs-operator">.</span><span class="hs-identifier">List</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">sortOn</span><span class="hs-special">)</span><span> </span><a name="line-56"></a><span class="hs-keyword">import</span><span> </span><span class="hs-identifier">Data</span><span class="hs-operator">.</span><span class="hs-identifier">List</span><span class="hs-operator">.</span><span class="hs-identifier">NonEmpty</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">NonEmpty</span><span class="hs-special">)</span><span> </span><a name="line-57"></a><span class="hs-keyword">import</span><span> </span><span class="hs-keyword">qualified</span><span> </span><span class="hs-identifier">Data</span><span class="hs-operator">.</span><span class="hs-identifier">List</span><span class="hs-operator">.</span><span class="hs-identifier">NonEmpty</span><span> </span><span class="hs-keyword">as</span><span> </span><span class="hs-identifier">NE</span><span> </span><a name="line-58"></a><span class="hs-keyword">import</span><span> </span><span class="hs-identifier">Lens</span><span class="hs-operator">.</span><span class="hs-identifier">Family2</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-operator hs-var">^.</span><span class="hs-special">)</span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-operator hs-var">.~</span><span class="hs-special">)</span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-operator hs-var">&</span><span class="hs-special">)</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">view</span><span class="hs-special">)</span><span> </span><a name="line-59"></a><span class="hs-keyword">import</span><span> </span><span class="hs-identifier">Options</span><span class="hs-operator">.</span><span class="hs-identifier">Applicative</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Parser</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">help</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">long</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">strOption</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">value</span><span class="hs-special">)</span><span> </span><a name="line-60"></a><span class="hs-keyword">import</span><span> </span><span class="hs-identifier">Proto</span><span class="hs-operator">.</span><span class="hs-identifier">Tensorflow</span><span class="hs-operator">.</span><span class="hs-identifier">Core</span><span class="hs-operator">.</span><span class="hs-identifier">Framework</span><span class="hs-operator">.</span><span class="hs-identifier">OpDef</span><span> </span><a name="line-61"></a><span> </span><span class="hs-special">(</span><span> </span><span class="hs-identifier hs-type">OpList</span><span> </span><a name="line-62"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">OpDef</span><span> </span><a name="line-63"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">attr</span><span> </span><a name="line-64"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">inputArg</span><span> </span><a name="line-65"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">name</span><span> </span><a name="line-66"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">op</span><span> </span><a name="line-67"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">outputArg</span><span> </span><a name="line-68"></a><span> </span><span class="hs-special">)</span><span> </span><a name="line-69"></a><span class="hs-keyword">import</span><span> </span><span class="hs-identifier">Proto</span><span class="hs-operator">.</span><span class="hs-identifier">Tensorflow</span><span class="hs-operator">.</span><span class="hs-identifier">Core</span><span class="hs-operator">.</span><span class="hs-identifier">Framework</span><span class="hs-operator">.</span><span class="hs-identifier">Types</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">DataType</span><span class="hs-special">(</span><span class="hs-glyph">..</span><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><a name="line-70"></a><span class="hs-keyword">import</span><span> </span><span class="hs-identifier">System</span><span class="hs-operator">.</span><span class="hs-identifier">FilePath</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">takeBaseName</span><span class="hs-special">)</span><span> </span><a name="line-71"></a><span class="hs-keyword">import</span><span> </span><a href="TensorFlow.OpGen.ParsedOp.html"><span class="hs-identifier">TensorFlow</span><span class="hs-operator">.</span><span class="hs-identifier">OpGen</span><span class="hs-operator">.</span><span class="hs-identifier">ParsedOp</span></a><span> </span><a name="line-72"></a><span class="hs-keyword">import</span><span> </span><span class="hs-identifier">Text</span><span class="hs-operator">.</span><span class="hs-identifier">PrettyPrint</span><span class="hs-operator">.</span><span class="hs-identifier">Mainland</span><span> </span><a name="line-73"></a><span> </span><span class="hs-special">(</span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-74"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-operator hs-var"><></span><span class="hs-special">)</span><span> </span><a name="line-75"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-operator hs-var"><+></span><span class="hs-special">)</span><span> </span><a name="line-76"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-operator hs-var"></></span><span class="hs-special">)</span><span> </span><a name="line-77"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-operator hs-var"><+/></span><span class="hs-special">)</span><span> </span><a name="line-78"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">brackets</span><span> </span><a name="line-79"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">comma</span><span> </span><a name="line-80"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">commasep</span><span> </span><a name="line-81"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">dquotes</span><span> </span><a name="line-82"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">empty</span><span> </span><a name="line-83"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">enclose</span><span> </span><a name="line-84"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">flatten</span><span> </span><a name="line-85"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">folddoc</span><span> </span><a name="line-86"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">hang</span><span> </span><a name="line-87"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">indent</span><span> </span><a name="line-88"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">parens</span><span> </span><a name="line-89"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">sep</span><span> </span><a name="line-90"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">stack</span><span> </span><a name="line-91"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">strictText</span><span> </span><a name="line-92"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">tuple</span><span> </span><a name="line-93"></a><span> </span><span class="hs-special">)</span><span> </span><a name="line-94"></a><span class="hs-keyword">import</span><span> </span><span class="hs-keyword">qualified</span><span> </span><span class="hs-identifier">Data</span><span class="hs-operator">.</span><span class="hs-identifier">Set</span><span> </span><span class="hs-keyword">as</span><span> </span><span class="hs-identifier">Set</span><span> </span><a name="line-95"></a><span class="hs-keyword">import</span><span> </span><span class="hs-keyword">qualified</span><span> </span><span class="hs-identifier">Data</span><span class="hs-operator">.</span><span class="hs-identifier">Text</span><span> </span><span class="hs-keyword">as</span><span> </span><span class="hs-identifier">Text</span><span> </span><a name="line-96"></a><span> </span><a name="line-97"></a><span class="hs-keyword">data</span><span> </span><a name="OpGenFlags"><a href="TensorFlow.OpGen.html#OpGenFlags"><span class="hs-identifier">OpGenFlags</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a name="OpGenFlags"><a href="TensorFlow.OpGen.html#OpGenFlags"><span class="hs-identifier">OpGenFlags</span></a></a><span> </span><a name="line-98"></a><span> </span><span class="hs-special">{</span><span> </span><a name="outputFile"><a href="TensorFlow.OpGen.html#outputFile"><span class="hs-identifier">outputFile</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">String</span><span> </span><a name="line-99"></a><span> </span><span class="hs-special">,</span><span> </span><a name="prefix"><a href="TensorFlow.OpGen.html#prefix"><span class="hs-identifier">prefix</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">String</span><span> </span><a name="line-100"></a><span> </span><span class="hs-special">,</span><span> </span><a name="excludeList"><a href="TensorFlow.OpGen.html#excludeList"><span class="hs-identifier">excludeList</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">String</span><span> </span><a name="line-101"></a><span> </span><span class="hs-special">}</span><span> </span><a name="line-102"></a><span> </span><a name="line-103"></a><span class="hs-identifier">flagParser</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Parser</span><span> </span><a href="TensorFlow.OpGen.html#OpGenFlags"><span class="hs-identifier hs-type">OpGenFlags</span></a><span> </span><a name="line-104"></a><a name="flagParser"><a href="TensorFlow.OpGen.html#flagParser"><span class="hs-identifier">flagParser</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="TensorFlow.OpGen.html#OpGenFlags"><span class="hs-identifier hs-var">OpGenFlags</span></a><span> </span><a name="line-105"></a><span> </span><span class="hs-operator hs-var"><$></span><span> </span><span class="hs-identifier hs-var">strOption</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">mconcat</span><span> </span><span class="hs-special">[</span><span> </span><span class="hs-identifier hs-var">long</span><span> </span><span class="hs-string">"output"</span><span> </span><a name="line-106"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">help</span><span> </span><span class="hs-string">"File to write."</span><span> </span><a name="line-107"></a><span> </span><span class="hs-special">]</span><span class="hs-special">)</span><span> </span><a name="line-108"></a><span> </span><span class="hs-operator hs-var"><*></span><span> </span><span class="hs-identifier hs-var">strOption</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">mconcat</span><span> </span><span class="hs-special">[</span><span> </span><span class="hs-identifier hs-var">long</span><span> </span><span class="hs-string">"prefix"</span><span> </span><a name="line-109"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">help</span><span> </span><span class="hs-string">"Haskell package prefix to use"</span><span> </span><a name="line-110"></a><span> </span><span class="hs-special">]</span><span class="hs-special">)</span><span> </span><a name="line-111"></a><span> </span><span class="hs-operator hs-var"><*></span><span> </span><span class="hs-identifier hs-var">strOption</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">mconcat</span><span> </span><span class="hs-special">[</span><span> </span><span class="hs-identifier hs-var">long</span><span> </span><span class="hs-string">"exclude_list"</span><span> </span><a name="line-112"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">value</span><span> </span><span class="hs-string">""</span><span> </span><a name="line-113"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">help</span><span> </span><span class="hs-string">"Comma separated Ops names to ignore"</span><span> </span><a name="line-114"></a><span> </span><span class="hs-special">]</span><span class="hs-special">)</span><span> </span><a name="line-115"></a><span> </span><a name="line-116"></a><span> </span><a name="line-117"></a><span class="hs-identifier">docOpList</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="TensorFlow.OpGen.html#OpGenFlags"><span class="hs-identifier hs-type">OpGenFlags</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">OpList</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-118"></a><a name="docOpList"><a href="TensorFlow.OpGen.html#docOpList"><span class="hs-identifier">docOpList</span></a></a><span> </span><a name="local-6989586621679057857"><a href="#local-6989586621679057857"><span class="hs-identifier">flags</span></a></a><span> </span><a name="local-6989586621679057858"><a href="#local-6989586621679057858"><span class="hs-identifier">opList</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a name="line-119"></a><span> </span><span class="hs-identifier hs-var">stack</span><span> </span><span class="hs-special">[</span><span> </span><span class="hs-string">"{-# LANGUAGE ConstraintKinds #-}"</span><span> </span><a name="line-120"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"{-# LANGUAGE DataKinds #-}"</span><span> </span><a name="line-121"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"{-# LANGUAGE FlexibleContexts #-}"</span><span> </span><a name="line-122"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"{-# LANGUAGE FlexibleInstances #-}"</span><span> </span><a name="line-123"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"{-# LANGUAGE OverloadedStrings #-}"</span><span> </span><a name="line-124"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"{-# LANGUAGE ScopedTypeVariables #-}"</span><span> </span><a name="line-125"></a><span> </span><span class="hs-comment">-- Avoids reports about shadowing standard library names.</span><span> </span><a name="line-126"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"{-# OPTIONS_GHC -fno-warn-name-shadowing #-}"</span><span> </span><a name="line-127"></a><span> </span><span class="hs-comment">-- eqLengthGuard never returns false and dies instead.</span><span> </span><a name="line-128"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}"</span><span> </span><a name="line-129"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"module"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-identifier hs-var">strictText</span><span> </span><a href="#local-6989586621679057859"><span class="hs-identifier hs-var">moduleName</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-string">"where"</span><span> </span><a name="line-130"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">empty</span><span> </span><a name="line-131"></a><span> </span><span class="hs-special">,</span><span> </span><a href="TensorFlow.OpGen.html#imports"><span class="hs-identifier hs-var">imports</span></a><span> </span><a name="line-132"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">empty</span><span> </span><a name="line-133"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">folddoc</span><span> </span><span class="hs-special">(</span><span class="hs-glyph">\</span><a name="local-6989586621679057984"><a href="#local-6989586621679057984"><span class="hs-identifier">x</span></a></a><span> </span><a name="local-6989586621679057985"><a href="#local-6989586621679057985"><span class="hs-identifier">y</span></a></a><span> </span><span class="hs-glyph">-></span><span> </span><a href="#local-6989586621679057984"><span class="hs-identifier hs-var">x</span></a><span> </span><span class="hs-operator hs-var"></></span><span> </span><span class="hs-identifier hs-var">empty</span><span> </span><span class="hs-operator hs-var"></></span><span> </span><a href="#local-6989586621679057985"><span class="hs-identifier hs-var">y</span></a><span class="hs-special">)</span><span> </span><a name="line-134"></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">map</span><span> </span><a href="#local-6989586621679057862"><span class="hs-identifier hs-var">renderOpAndExtras</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><a name="line-135"></a><span> </span><span class="hs-identifier hs-var">sortOn</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">view</span><span> </span><span class="hs-identifier hs-var">name</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a name="line-136"></a><span> </span><span class="hs-identifier hs-var">filter</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">not</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">flip</span><span> </span><span class="hs-identifier hs-var">elem</span><span> </span><a href="#local-6989586621679057861"><span class="hs-identifier hs-var">exclusions</span></a><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">view</span><span> </span><span class="hs-identifier hs-var">name</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a name="line-137"></a><span> </span><span class="hs-identifier hs-var">toList</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="#local-6989586621679057858"><span class="hs-identifier hs-var">opList</span></a><span> </span><span class="hs-operator hs-var">^.</span><span> </span><span class="hs-identifier hs-var">op</span><span class="hs-special">)</span><span> </span><a name="line-138"></a><span> </span><span class="hs-special">]</span><span> </span><a name="line-139"></a><span> </span><span class="hs-keyword">where</span><span> </span><a name="local-6989586621679057859"><a href="#local-6989586621679057859"><span class="hs-identifier">moduleName</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a name="line-140"></a><span> </span><span class="hs-identifier hs-var">Text</span><span class="hs-operator hs-var">.</span><span class="hs-identifier hs-var">pack</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">prefix</span><span> </span><a href="#local-6989586621679057857"><span class="hs-identifier hs-var">flags</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var"><></span><span> </span><span class="hs-string">"."</span><span> </span><span class="hs-operator hs-var"><></span><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#camelCase"><span class="hs-identifier hs-var">camelCase</span></a><span> </span><a name="line-141"></a><span> </span><span class="hs-comment">-- Discards the optional trailing _ops_op_lib</span><span> </span><a name="line-142"></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fromMaybe</span><span> </span><a href="#local-6989586621679057860"><span class="hs-identifier hs-var">shortName</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">Text</span><span class="hs-operator hs-var">.</span><span class="hs-identifier hs-var">stripSuffix</span><span> </span><span class="hs-string">"_ops_op_lib"</span><span> </span><a href="#local-6989586621679057860"><span class="hs-identifier hs-var">shortName</span></a><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><a name="line-143"></a><span> </span><a name="local-6989586621679057860"><a href="#local-6989586621679057860"><span class="hs-identifier">shortName</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">Text</span><span class="hs-operator hs-var">.</span><span class="hs-identifier hs-var">pack</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">takeBaseName</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">outputFile</span><span> </span><a href="#local-6989586621679057857"><span class="hs-identifier hs-var">flags</span></a><span class="hs-special">)</span><span> </span><a name="line-144"></a><span> </span><a name="local-6989586621679057861"><a href="#local-6989586621679057861"><span class="hs-identifier">exclusions</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">Text</span><span class="hs-operator hs-var">.</span><span class="hs-identifier hs-var">splitOn</span><span> </span><span class="hs-string">","</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">Text</span><span class="hs-operator hs-var">.</span><span class="hs-identifier hs-var">pack</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">excludeList</span><span> </span><a href="#local-6989586621679057857"><span class="hs-identifier hs-var">flags</span></a><span> </span><a name="line-145"></a><span> </span><a name="local-6989586621679057862"><a href="#local-6989586621679057862"><span class="hs-identifier">renderOpAndExtras</span></a></a><span> </span><a name="local-6989586621679057983"><a href="#local-6989586621679057983"><span class="hs-identifier">o</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="TensorFlow.OpGen.html#renderOp"><span class="hs-identifier hs-var">renderOp</span></a><span> </span><span class="hs-special">(</span><a href="TensorFlow.OpGen.ParsedOp.html#parseOp"><span class="hs-identifier hs-var">parseOp</span></a><span> </span><a href="#local-6989586621679057983"><span class="hs-identifier hs-var">o</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var"></></span><span> </span><a href="TensorFlow.OpGen.html#extras"><span class="hs-identifier hs-var">extras</span></a><span> </span><a href="#local-6989586621679057983"><span class="hs-identifier hs-var">o</span></a><span> </span><a name="line-146"></a><span> </span><a name="line-147"></a><span class="hs-identifier">imports</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-148"></a><a name="imports"><a href="TensorFlow.OpGen.html#imports"><span class="hs-identifier">imports</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">stack</span><span> </span><span class="hs-special">[</span><span> </span><a name="line-149"></a><span> </span><span class="hs-string">"import Data.ByteString (ByteString)"</span><span> </span><a name="line-150"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"import Data.Complex (Complex)"</span><span> </span><a name="line-151"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"import Data.Int (Int8, Int16, Int32, Int64)"</span><span> </span><a name="line-152"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"import Data.Proxy (Proxy(Proxy))"</span><span> </span><a name="line-153"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"import Data.Word (Word8, Word16)"</span><span> </span><a name="line-154"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"import Lens.Family2 ((.~), (&))"</span><span> </span><a name="line-155"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"import TensorFlow.Build"</span><span> </span><a name="line-156"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"import TensorFlow.BuildOp"</span><span> </span><a name="line-157"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"import TensorFlow.Tensor"</span><span> </span><a name="line-158"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"import TensorFlow.Types"</span><span> </span><a name="line-159"></a><span> </span><span class="hs-special">]</span><span> </span><a name="line-160"></a><span> </span><a name="line-161"></a><span class="hs-identifier">renderHaskellName</span><span class="hs-special">,</span><span> </span><span class="hs-identifier">renderTFName</span><span class="hs-special">,</span><span> </span><span class="hs-identifier">renderQuotedTFName</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#Name"><span class="hs-identifier hs-type">Name</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-162"></a><a name="renderHaskellName"><a href="TensorFlow.OpGen.html#renderHaskellName"><span class="hs-identifier">renderHaskellName</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">strictText</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier">unHaskellName</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier">haskellName</span><span> </span><a name="line-163"></a><a name="renderTFName"><a href="TensorFlow.OpGen.html#renderTFName"><span class="hs-identifier">renderTFName</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">strictText</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier">unTFName</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier">tfName</span><span> </span><a name="line-164"></a><a name="renderQuotedTFName"><a href="TensorFlow.OpGen.html#renderQuotedTFName"><span class="hs-identifier">renderQuotedTFName</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">dquotes</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><a href="TensorFlow.OpGen.html#renderTFName"><span class="hs-identifier hs-var">renderTFName</span></a><span> </span><a name="line-165"></a><span> </span><a name="line-166"></a><span> </span><a name="line-167"></a><span class="hs-comment">-- | Generate the source code for a single op.</span><span> </span><a name="line-168"></a><span class="hs-comment">-- For example:</span><span> </span><a name="line-169"></a><span class="hs-comment">--</span><span> </span><a name="line-170"></a><span class="hs-comment">-- -- | {haddock comment}</span><span> </span><a name="line-171"></a><span class="hs-comment">-- foo :: {type sig}</span><span> </span><a name="line-172"></a><span class="hs-comment">-- foo attr1 attr2 input1 input2 | eqLengthGuard [...] = {function body}</span><span> </span><a name="line-173"></a><span class="hs-identifier">renderOp</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#ParsedOp"><span class="hs-identifier hs-type">ParsedOp</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-174"></a><a name="renderOp"><a href="TensorFlow.OpGen.html#renderOp"><span class="hs-identifier">renderOp</span></a></a><span> </span><a name="local-6989586621679057986"><a href="#local-6989586621679057986"><span class="hs-identifier">pOp</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">stack</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a name="line-175"></a><span> </span><span class="hs-special">[</span><span> </span><a href="#local-6989586621679057991"><span class="hs-identifier hs-var">haddocks</span></a><span> </span><a name="line-176"></a><span> </span><span class="hs-comment">-- Prevent unreasonably long compilation times on ghc-7.10, due</span><span> </span><a name="line-177"></a><span> </span><span class="hs-comment">-- to stack calling "-dump-hi" which (unnecessarily) includes the</span><span> </span><a name="line-178"></a><span> </span><span class="hs-comment">-- inlining information, and is large for ops with many arguments.</span><span> </span><a name="line-179"></a><span class="hs-cpp">#if __GLASGOW_HASKELL__ < 800</span><span> </span><a name="line-180"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"{-# NOINLINE"</span><span> </span><span class="hs-operator"><+></span><span> </span><span class="hs-identifier">n</span><span> </span><span class="hs-operator"><+></span><span> </span><span class="hs-string">"#-}"</span><span> </span><a name="line-181"></a><span class="hs-cpp">#endif</span><span> </span><a name="line-182"></a><span> </span><span class="hs-special">,</span><span> </span><a href="#local-6989586621679057987"><span class="hs-identifier hs-var">n</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-string">"::"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-identifier hs-var">hang</span><span> </span><span class="hs-number">0</span><span> </span><span class="hs-special">(</span><a href="TensorFlow.OpGen.html#typeSig"><span class="hs-identifier hs-var">typeSig</span></a><span> </span><span class="hs-identifier hs-var">empty</span><span> </span><a href="#local-6989586621679057986"><span class="hs-identifier hs-var">pOp</span></a><span class="hs-special">)</span><span> </span><a name="line-183"></a><span> </span><span class="hs-special">,</span><span> </span><a href="#local-6989586621679057987"><span class="hs-identifier hs-var">n</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-string">"="</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679057987"><span class="hs-identifier hs-var">n</span></a><span> </span><span class="hs-operator hs-var"><></span><span> </span><span class="hs-string">"' id"</span><span> </span><a name="line-184"></a><span> </span><span class="hs-special">,</span><span> </span><a href="#local-6989586621679057988"><span class="hs-identifier hs-var">n'</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-string">"::"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-identifier hs-var">hang</span><span> </span><span class="hs-number">0</span><span> </span><span class="hs-special">(</span><a href="TensorFlow.OpGen.html#typeSig"><span class="hs-identifier hs-var">typeSig</span></a><span> </span><span class="hs-string">"OpParams ->"</span><span> </span><a href="#local-6989586621679057986"><span class="hs-identifier hs-var">pOp</span></a><span class="hs-special">)</span><span> </span><a name="line-185"></a><span> </span><span class="hs-special">,</span><span> </span><a href="#local-6989586621679057988"><span class="hs-identifier hs-var">n'</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-identifier hs-var">hang</span><span> </span><span class="hs-number">0</span><span> </span><a href="#local-6989586621679057990"><span class="hs-identifier hs-var">args</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-string">"|"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#funcGuard"><span class="hs-identifier hs-var">funcGuard</span></a><span> </span><a href="#local-6989586621679057989"><span class="hs-identifier hs-var">listSizeAttrs</span></a><span> </span><a name="line-186"></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-string">"="</span><span> </span><span class="hs-operator hs-var"></></span><span> </span><span class="hs-comment">-- args are indented</span><span> </span><a name="line-187"></a><span> </span><span class="hs-comment">-- the body needs to be indented wrt the name</span><span> </span><a name="line-188"></a><span> </span><span class="hs-identifier hs-var">indent</span><span> </span><a href="TensorFlow.OpGen.html#indentation"><span class="hs-identifier hs-var">indentation</span></a><span> </span><span class="hs-special">(</span><a href="TensorFlow.OpGen.html#functionBody"><span class="hs-identifier hs-var">functionBody</span></a><span> </span><a href="#local-6989586621679057986"><span class="hs-identifier hs-var">pOp</span></a><span class="hs-special">)</span><span> </span><a name="line-189"></a><span> </span><span class="hs-special">]</span><span> </span><span class="hs-operator hs-var">++</span><span> </span><a href="TensorFlow.OpGen.html#whereClause"><span class="hs-identifier hs-var">whereClause</span></a><span> </span><a href="#local-6989586621679057989"><span class="hs-identifier hs-var">listSizeAttrs</span></a><span> </span><a name="line-190"></a><span> </span><span class="hs-keyword">where</span><span> </span><a name="line-191"></a><span> </span><a name="local-6989586621679057987"><a href="#local-6989586621679057987"><span class="hs-identifier">n</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="TensorFlow.OpGen.html#renderHaskellName"><span class="hs-identifier hs-var">renderHaskellName</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">parsedOpName</span><span> </span><a href="#local-6989586621679057986"><span class="hs-identifier hs-var">pOp</span></a><span> </span><a name="line-192"></a><span> </span><a name="local-6989586621679057988"><a href="#local-6989586621679057988"><span class="hs-identifier">n'</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679057987"><span class="hs-identifier hs-var">n</span></a><span> </span><span class="hs-operator hs-var"><></span><span> </span><span class="hs-string">"'"</span><span> </span><a name="line-193"></a><span> </span><a name="local-6989586621679057989"><a href="#local-6989586621679057989"><span class="hs-identifier">listSizeAttrs</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier">inferredListSizeAttrs</span><span> </span><a href="#local-6989586621679057986"><span class="hs-identifier hs-var">pOp</span></a><span> </span><a name="line-194"></a><span> </span><a name="local-6989586621679057990"><a href="#local-6989586621679057990"><span class="hs-identifier">args</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">sep</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-string">"op'options"</span><span> </span><a name="line-195"></a><span> </span><span class="hs-glyph">:</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">map</span><span> </span><a href="TensorFlow.OpGen.html#renderHaskellName"><span class="hs-identifier hs-var">renderHaskellName</span></a><span> </span><a name="line-196"></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><span class="hs-identifier">attrName</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">explicitInputAttrs</span><span> </span><a href="#local-6989586621679057986"><span class="hs-identifier hs-var">pOp</span></a><span class="hs-special">)</span><span> </span><a name="line-197"></a><span> </span><span class="hs-operator hs-var">++</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><span class="hs-identifier">parsedArgName</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">parsedInputs</span><span> </span><a href="#local-6989586621679057986"><span class="hs-identifier hs-var">pOp</span></a><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><a name="line-198"></a><span> </span><a name="local-6989586621679057991"><a href="#local-6989586621679057991"><span class="hs-identifier">haddocks</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"-- |"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#multilineComment"><span class="hs-identifier hs-var">multilineComment</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">parsedOpSummary</span><span> </span><a href="#local-6989586621679057986"><span class="hs-identifier hs-var">pOp</span></a><span class="hs-special">)</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">parsedOpDescription</span><span> </span><a href="#local-6989586621679057986"><span class="hs-identifier hs-var">pOp</span></a><span class="hs-special">)</span><span> </span><a name="line-199"></a><span> </span><a name="line-200"></a><span class="hs-comment">-- | A check that all lists of the given size have the given length.</span><span> </span><a name="line-201"></a><span class="hs-comment">-- For example:</span><span> </span><a name="line-202"></a><span class="hs-comment">-- eqLengthGuard [("N", [("input1", length input1), ("input2", length input2)])]</span><span> </span><a name="line-203"></a><span class="hs-identifier">funcGuard</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">[</span><a href="TensorFlow.OpGen.ParsedOp.html#Attr"><span class="hs-identifier hs-type">Attr</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">NonEmpty</span><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#Name"><span class="hs-identifier hs-type">Name</span></a><span class="hs-special">)</span><span class="hs-special">]</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-204"></a><a name="funcGuard"><a href="TensorFlow.OpGen.html#funcGuard"><span class="hs-identifier">funcGuard</span></a></a><span> </span><a name="local-6989586621679057992"><a href="#local-6989586621679057992"><span class="hs-identifier">attrs</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"eqLengthGuard"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-identifier hs-var">brackets</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">commasep</span><span> </span><a href="#local-6989586621679057993"><span class="hs-identifier hs-var">entries</span></a><span class="hs-special">)</span><span> </span><a name="line-205"></a><span> </span><span class="hs-keyword">where</span><span> </span><a name="line-206"></a><span> </span><a name="local-6989586621679057993"><a href="#local-6989586621679057993"><span class="hs-identifier">entries</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a name="line-207"></a><span> </span><span class="hs-special">[</span><span> </span><span class="hs-identifier hs-var">parens</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="#local-6989586621679057996"><span class="hs-identifier hs-var">nAttr</span></a><span> </span><span class="hs-operator hs-var"><></span><span> </span><span class="hs-identifier hs-var">comma</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a name="line-208"></a><span> </span><span class="hs-identifier hs-var">brackets</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">commasep</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">toList</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a name="line-209"></a><span> </span><span class="hs-identifier hs-var">map</span><span> </span><a href="#local-6989586621679057994"><span class="hs-identifier hs-var">renderTensorName</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">toList</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">attrInfo</span><span> </span><a href="#local-6989586621679057995"><span class="hs-identifier hs-var">a</span></a><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><a name="line-210"></a><span> </span><span class="hs-glyph">|</span><span> </span><a name="local-6989586621679057995"><a href="#local-6989586621679057995"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-glyph"><-</span><span> </span><a href="#local-6989586621679057992"><span class="hs-identifier hs-var">attrs</span></a><span> </span><a name="line-211"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679057996"><a href="#local-6989586621679057996"><span class="hs-identifier">nAttr</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="TensorFlow.OpGen.html#renderQuotedTFName"><span class="hs-identifier hs-var">renderQuotedTFName</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">attrName</span><span> </span><a href="#local-6989586621679057995"><span class="hs-identifier hs-var">a</span></a><span class="hs-special">)</span><span> </span><a name="line-212"></a><span> </span><span class="hs-special">]</span><span> </span><a name="line-213"></a><span> </span><a name="local-6989586621679057994"><a href="#local-6989586621679057994"><span class="hs-identifier">renderTensorName</span></a></a><span> </span><a name="local-6989586621679057997"><a href="#local-6989586621679057997"><span class="hs-identifier">x</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">parens</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="TensorFlow.OpGen.html#renderQuotedTFName"><span class="hs-identifier hs-var">renderQuotedTFName</span></a><span> </span><a href="#local-6989586621679057997"><span class="hs-identifier hs-var">x</span></a><span> </span><span class="hs-operator hs-var"><></span><span> </span><span class="hs-identifier hs-var">comma</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a name="line-214"></a><span> </span><span class="hs-string">"length"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#renderHaskellName"><span class="hs-identifier hs-var">renderHaskellName</span></a><span> </span><a href="#local-6989586621679057997"><span class="hs-identifier hs-var">x</span></a><span> </span><a name="line-215"></a><span> </span><a name="line-216"></a><span class="hs-comment">-- | Define the implicit list length attributes.</span><span> </span><a name="line-217"></a><span class="hs-comment">-- For example:</span><span> </span><a name="line-218"></a><span class="hs-comment">-- where</span><span> </span><a name="line-219"></a><span class="hs-comment">-- n1 = fromIntegral (length input1) :: Int64</span><span> </span><a name="line-220"></a><span class="hs-comment">-- n2 = fromIntegral (length input2) :: Int64</span><span> </span><a name="line-221"></a><span class="hs-identifier">whereClause</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">[</span><a href="TensorFlow.OpGen.ParsedOp.html#Attr"><span class="hs-identifier hs-type">Attr</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">NonEmpty</span><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#Name"><span class="hs-identifier hs-type">Name</span></a><span class="hs-special">)</span><span class="hs-special">]</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-special">[</span><span class="hs-identifier hs-type">Doc</span><span class="hs-special">]</span><span> </span><a name="line-222"></a><a name="whereClause"><a href="TensorFlow.OpGen.html#whereClause"><span class="hs-identifier">whereClause</span></a></a><span> </span><span class="hs-special">[</span><span class="hs-special">]</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">[</span><span class="hs-special">]</span><span> </span><a name="line-223"></a><span class="hs-identifier">whereClause</span><span> </span><span class="hs-keyword">as</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">[</span><span class="hs-identifier hs-var">indent</span><span> </span><span class="hs-number">2</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-string">"where"</span><span> </span><span class="hs-operator hs-var"></></span><span> </span><span class="hs-identifier hs-var">indent</span><span> </span><span class="hs-number">2</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">stack</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><a href="#local-6989586621679057999"><span class="hs-identifier hs-var">defineLengthAttr</span></a><span> </span><span class="hs-keyword">as</span><span class="hs-special">)</span><span class="hs-special">]</span><span> </span><a name="line-224"></a><span> </span><span class="hs-keyword">where</span><span> </span><a name="line-225"></a><span> </span><a name="local-6989586621679057999"><a href="#local-6989586621679057999"><span class="hs-identifier">defineLengthAttr</span></a></a><span> </span><a name="local-6989586621679058000"><a href="#local-6989586621679058000"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="TensorFlow.OpGen.html#renderHaskellAttrName"><span class="hs-identifier hs-var">renderHaskellAttrName</span></a><span> </span><a href="#local-6989586621679058000"><span class="hs-identifier hs-var">a</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-string">"="</span><span> </span><a name="line-226"></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-string">"fromIntegral (length"</span><span> </span><a name="line-227"></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#renderHaskellName"><span class="hs-identifier hs-var">renderHaskellName</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">NE</span><span class="hs-operator hs-var">.</span><span class="hs-identifier hs-var">head</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">attrInfo</span><span> </span><a href="#local-6989586621679058000"><span class="hs-identifier hs-var">a</span></a><span class="hs-special">)</span><span> </span><a name="line-228"></a><span> </span><span class="hs-operator hs-var"><></span><span> </span><span class="hs-string">") :: Int64"</span><span> </span><a name="line-229"></a><span> </span><a name="line-230"></a><span class="hs-identifier">renderHaskellAttrName</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#Attr"><span class="hs-identifier hs-type">Attr</span></a><span> </span><a href="#local-6989586621679056606"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-231"></a><a name="renderHaskellAttrName"><a href="TensorFlow.OpGen.html#renderHaskellAttrName"><span class="hs-identifier">renderHaskellAttrName</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="TensorFlow.OpGen.html#renderHaskellName"><span class="hs-identifier hs-var">renderHaskellName</span></a><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier">attrName</span><span> </span><a name="line-232"></a><span> </span><a name="line-233"></a><span class="hs-identifier">functionBody</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#ParsedOp"><span class="hs-identifier hs-type">ParsedOp</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-234"></a><a name="functionBody"><a href="TensorFlow.OpGen.html#functionBody"><span class="hs-identifier">functionBody</span></a></a><span> </span><a name="local-6989586621679058001"><a href="#local-6989586621679058001"><span class="hs-identifier">pOp</span></a></a><span> </span><a name="line-235"></a><span> </span><span class="hs-glyph">|</span><span> </span><span class="hs-identifier">parsedOpIsMonadic</span><span> </span><a href="#local-6989586621679058001"><span class="hs-identifier hs-var">pOp</span></a><span> </span><a name="line-236"></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"build $ do"</span><span> </span><a name="line-237"></a><span> </span><span class="hs-operator hs-var"></></span><span> </span><span class="hs-identifier hs-var">indent</span><span> </span><a href="TensorFlow.OpGen.html#indentation"><span class="hs-identifier hs-var">indentation</span></a><span> </span><span class="hs-special">(</span><a href="#local-6989586621679058004"><span class="hs-identifier hs-var">bindOpInputsVar</span></a><span> </span><a name="line-238"></a><span> </span><span class="hs-operator hs-var"></></span><span> </span><span class="hs-string">"buildOp"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058002"><span class="hs-identifier hs-var">outputListsSizes</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058005"><span class="hs-identifier hs-var">opDef</span></a><span class="hs-special">)</span><span> </span><a name="line-239"></a><span> </span><span class="hs-glyph">|</span><span> </span><span class="hs-identifier hs-var">otherwise</span><span> </span><a name="line-240"></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"pureOp"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058002"><span class="hs-identifier hs-var">outputListsSizes</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-string">"$ do"</span><span> </span><a name="line-241"></a><span> </span><span class="hs-operator hs-var"></></span><span> </span><span class="hs-identifier hs-var">indent</span><span> </span><a href="TensorFlow.OpGen.html#indentation"><span class="hs-identifier hs-var">indentation</span></a><span> </span><span class="hs-special">(</span><a href="#local-6989586621679058004"><span class="hs-identifier hs-var">bindOpInputsVar</span></a><span> </span><span class="hs-operator hs-var"></></span><span> </span><span class="hs-string">"return"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058005"><span class="hs-identifier hs-var">opDef</span></a><span class="hs-special">)</span><span> </span><a name="line-242"></a><span> </span><span class="hs-keyword">where</span><span> </span><a name="line-243"></a><span> </span><a name="local-6989586621679058002"><a href="#local-6989586621679058002"><span class="hs-identifier">outputListsSizes</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">brackets</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">commasep</span><span> </span><a name="line-244"></a><span> </span><span class="hs-special">[</span><span> </span><a href="TensorFlow.OpGen.html#renderHaskellName"><span class="hs-identifier hs-var">renderHaskellName</span></a><span> </span><a href="#local-6989586621679058009"><span class="hs-identifier hs-var">a</span></a><span> </span><a name="line-245"></a><span> </span><span class="hs-glyph">|</span><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#ParsedArg"><span class="hs-identifier hs-var">ParsedArg</span></a><span> </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">parsedArgCase</span><span> </span><span class="hs-glyph">=</span><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#ListArg"><span class="hs-identifier hs-var">ListArg</span></a><span> </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">argLength</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679058009"><a href="#local-6989586621679058009"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-special">}</span><span> </span><span class="hs-special">}</span><span> </span><a name="line-246"></a><span> </span><span class="hs-glyph"><-</span><span> </span><span class="hs-identifier">parsedOutputs</span><span> </span><a href="#local-6989586621679058001"><span class="hs-identifier hs-var">pOp</span></a><span> </span><a name="line-247"></a><span> </span><span class="hs-special">]</span><span> </span><a name="line-248"></a><span> </span><a name="local-6989586621679058003"><a href="#local-6989586621679058003"><span class="hs-identifier">opInputsVar</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"op'inputs"</span><span> </span><a name="line-249"></a><span> </span><a name="local-6989586621679058004"><a href="#local-6989586621679058004"><span class="hs-identifier">bindOpInputsVar</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679058003"><span class="hs-identifier hs-var">opInputsVar</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-string">"<- fmap Prelude.concat $ Prelude.sequence"</span><span> </span><a name="line-250"></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-identifier hs-var">brackets</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">commasep</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><span class="hs-special">(</span><span class="hs-glyph">\</span><a name="local-6989586621679058010"><a href="#local-6989586621679058010"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-string">"buildInputs"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058010"><span class="hs-identifier hs-var">a</span></a><span class="hs-special">)</span><span> </span><a href="#local-6989586621679058006"><span class="hs-identifier hs-var">tensorArgs</span></a><span class="hs-special">)</span><span> </span><a name="line-251"></a><span> </span><a name="local-6989586621679058005"><a href="#local-6989586621679058005"><span class="hs-identifier">opDef</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">parens</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">hang</span><span> </span><span class="hs-number">0</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">stack</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a name="line-252"></a><span> </span><span class="hs-string">"opDef"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#renderQuotedTFName"><span class="hs-identifier hs-var">renderQuotedTFName</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">parsedOpName</span><span> </span><a href="#local-6989586621679058001"><span class="hs-identifier hs-var">pOp</span></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">:</span><span> </span><a name="line-253"></a><span> </span><span class="hs-comment">-- Renders type parameter arguments.</span><span> </span><a name="line-254"></a><span> </span><span class="hs-special">[</span><span> </span><span class="hs-string">"& opAttr"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#renderQuotedTFName"><span class="hs-identifier hs-var">renderQuotedTFName</span></a><span> </span><a href="#local-6989586621679058012"><span class="hs-identifier hs-var">n</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-string">".~"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058008"><span class="hs-identifier hs-var">inferredTypeExpr</span></a><span> </span><a href="#local-6989586621679058011"><span class="hs-identifier hs-var">a</span></a><span> </span><a name="line-255"></a><span> </span><span class="hs-glyph">|</span><span> </span><a name="local-6989586621679058011"><a href="#local-6989586621679058011"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-glyph"><-</span><span> </span><span class="hs-identifier">inferredTypeAttrs</span><span> </span><a href="#local-6989586621679058001"><span class="hs-identifier hs-var">pOp</span></a><span class="hs-special">,</span><span> </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679058012"><a href="#local-6989586621679058012"><span class="hs-identifier">n</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier">attrName</span><span> </span><a href="#local-6989586621679058011"><span class="hs-identifier hs-var">a</span></a><span> </span><a name="line-256"></a><span> </span><span class="hs-special">]</span><span> </span><span class="hs-operator hs-var">++</span><span> </span><a name="line-257"></a><span> </span><span class="hs-comment">-- Renders mandatory attributes as function parameters.</span><span> </span><a name="line-258"></a><span> </span><span class="hs-special">[</span><span> </span><span class="hs-string">"& opAttr"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#renderQuotedTFName"><span class="hs-identifier hs-var">renderQuotedTFName</span></a><span> </span><a href="#local-6989586621679058014"><span class="hs-identifier hs-var">n</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-string">".~"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#renderHaskellName"><span class="hs-identifier hs-var">renderHaskellName</span></a><span> </span><a href="#local-6989586621679058014"><span class="hs-identifier hs-var">n</span></a><span> </span><a name="line-259"></a><span> </span><span class="hs-glyph">|</span><span> </span><a name="local-6989586621679058013"><a href="#local-6989586621679058013"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-glyph"><-</span><span> </span><span class="hs-identifier">explicitInputAttrs</span><span> </span><a href="#local-6989586621679058001"><span class="hs-identifier hs-var">pOp</span></a><span class="hs-special">,</span><span> </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679058014"><a href="#local-6989586621679058014"><span class="hs-identifier">n</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier">attrName</span><span> </span><a href="#local-6989586621679058013"><span class="hs-identifier hs-var">a</span></a><span> </span><a name="line-260"></a><span> </span><span class="hs-special">]</span><span> </span><span class="hs-operator hs-var">++</span><span> </span><a name="line-261"></a><span> </span><span class="hs-comment">-- Renders sizes of tensor list types having number_attr.</span><span> </span><a name="line-262"></a><span> </span><span class="hs-special">[</span><span> </span><span class="hs-string">"& opAttr"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#renderQuotedTFName"><span class="hs-identifier hs-var">renderQuotedTFName</span></a><span> </span><a href="#local-6989586621679058016"><span class="hs-identifier hs-var">n</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-string">".~"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#renderHaskellName"><span class="hs-identifier hs-var">renderHaskellName</span></a><span> </span><a href="#local-6989586621679058016"><span class="hs-identifier hs-var">n</span></a><span> </span><a name="line-263"></a><span> </span><span class="hs-glyph">|</span><span> </span><a name="local-6989586621679058015"><a href="#local-6989586621679058015"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-glyph"><-</span><span> </span><span class="hs-identifier">inferredListSizeAttrs</span><span> </span><a href="#local-6989586621679058001"><span class="hs-identifier hs-var">pOp</span></a><span class="hs-special">,</span><span> </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679058016"><a href="#local-6989586621679058016"><span class="hs-identifier">n</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier">attrName</span><span> </span><a href="#local-6989586621679058015"><span class="hs-identifier hs-var">a</span></a><span> </span><a name="line-264"></a><span> </span><span class="hs-special">]</span><span> </span><span class="hs-operator hs-var">++</span><span> </span><a name="line-265"></a><span> </span><span class="hs-special">[</span><span class="hs-string">"& op'options & opInputs .~"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058003"><span class="hs-identifier hs-var">opInputsVar</span></a><span class="hs-special">]</span><span> </span><a name="line-266"></a><span> </span><a name="local-6989586621679058006"><a href="#local-6989586621679058006"><span class="hs-identifier">tensorArgs</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679058007"><span class="hs-identifier hs-var">renderTensorArg</span></a><span> </span><span class="hs-operator hs-var"><$></span><span> </span><span class="hs-identifier">parsedInputs</span><span> </span><a href="#local-6989586621679058001"><span class="hs-identifier hs-var">pOp</span></a><span> </span><a name="line-267"></a><span> </span><a name="local-6989586621679058007"><a href="#local-6989586621679058007"><span class="hs-identifier">renderTensorArg</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="TensorFlow.OpGen.html#renderHaskellName"><span class="hs-identifier hs-var">renderHaskellName</span></a><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier">parsedArgName</span><span> </span><a name="line-268"></a><span> </span><a name="local-6989586621679058008"><a href="#local-6989586621679058008"><span class="hs-identifier">inferredTypeExpr</span></a></a><span> </span><a name="local-6989586621679058017"><a href="#local-6989586621679058017"><span class="hs-identifier">a</span></a></a><span> </span><a name="line-269"></a><span> </span><span class="hs-glyph">|</span><span> </span><span class="hs-identifier">typeParamIsList</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">attrInfo</span><span> </span><a href="#local-6989586621679058017"><span class="hs-identifier hs-var">a</span></a><span> </span><a name="line-270"></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"fromTensorTypes (Proxy :: Proxy"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#renderHaskellAttrName"><span class="hs-identifier hs-var">renderHaskellAttrName</span></a><span> </span><a href="#local-6989586621679058017"><span class="hs-identifier hs-var">a</span></a><span> </span><a name="line-271"></a><span> </span><span class="hs-operator hs-var"><></span><span> </span><span class="hs-string">")"</span><span> </span><a name="line-272"></a><span> </span><span class="hs-glyph">|</span><span> </span><span class="hs-identifier hs-var">otherwise</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"tensorType (undefined ::"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#renderHaskellAttrName"><span class="hs-identifier hs-var">renderHaskellAttrName</span></a><span> </span><a href="#local-6989586621679058017"><span class="hs-identifier hs-var">a</span></a><span> </span><a name="line-273"></a><span> </span><span class="hs-operator hs-var"><></span><span> </span><span class="hs-string">")"</span><span> </span><a name="line-274"></a><span> </span><a name="line-275"></a><span class="hs-comment">-- | Write a comment with the inputs/outputs/attributes in proto format, for</span><span> </span><a name="line-276"></a><span class="hs-comment">-- debugging.</span><span> </span><a name="line-277"></a><span class="hs-identifier">extras</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">OpDef</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-278"></a><a name="extras"><a href="TensorFlow.OpGen.html#extras"><span class="hs-identifier">extras</span></a></a><span> </span><a name="local-6989586621679058018"><a href="#local-6989586621679058018"><span class="hs-identifier">d</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">enclose</span><span> </span><span class="hs-string">"{-\n"</span><span> </span><span class="hs-string">"\n-}"</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a name="line-279"></a><span> </span><span class="hs-identifier hs-var">strictText</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">Text</span><span class="hs-operator hs-var">.</span><span class="hs-identifier hs-var">pack</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a name="line-280"></a><span> </span><span class="hs-identifier hs-var">showMessage</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-identifier hs-var">def</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">OpDef</span><span class="hs-special">)</span><span> </span><a name="line-281"></a><span> </span><span class="hs-operator hs-var">&</span><span> </span><span class="hs-identifier hs-var">inputArg</span><span> </span><span class="hs-operator hs-var">.~</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679058018"><span class="hs-identifier hs-var">d</span></a><span> </span><span class="hs-operator hs-var">^.</span><span> </span><span class="hs-identifier hs-var">inputArg</span><span class="hs-special">)</span><span> </span><a name="line-282"></a><span> </span><span class="hs-operator hs-var">&</span><span> </span><span class="hs-identifier hs-var">outputArg</span><span> </span><span class="hs-operator hs-var">.~</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679058018"><span class="hs-identifier hs-var">d</span></a><span> </span><span class="hs-operator hs-var">^.</span><span> </span><span class="hs-identifier hs-var">outputArg</span><span class="hs-special">)</span><span> </span><a name="line-283"></a><span> </span><span class="hs-operator hs-var">&</span><span> </span><span class="hs-identifier hs-var">attr</span><span> </span><span class="hs-operator hs-var">.~</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679058018"><span class="hs-identifier hs-var">d</span></a><span> </span><span class="hs-operator hs-var">^.</span><span> </span><span class="hs-identifier hs-var">attr</span><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><a name="line-284"></a><span> </span><a name="line-285"></a><span class="hs-comment">-- | The type signature for an op.</span><span> </span><a name="line-286"></a><span class="hs-comment">-- Of the form:</span><span> </span><a name="line-287"></a><span class="hs-comment">-- forall t1 t2 v1 v2 . (TensorType t1, TensorType t2)</span><span> </span><a name="line-288"></a><span class="hs-comment">-- => {pre} Float -> Tensor t1 v1 -> Tensor t2 v2</span><span> </span><a name="line-289"></a><span class="hs-comment">-- where "Float" is an explicit input attribute, "Tensor t1 v1" is an input, and</span><span> </span><a name="line-290"></a><span class="hs-comment">-- "Tensor t2 v2" is an output.</span><span> </span><a name="line-291"></a><span class="hs-identifier">typeSig</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><span class="hs-glyph">-></span><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#ParsedOp"><span class="hs-identifier hs-type">ParsedOp</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-292"></a><a name="typeSig"><a href="TensorFlow.OpGen.html#typeSig"><span class="hs-identifier">typeSig</span></a></a><span> </span><a name="local-6989586621679058436"><a href="#local-6989586621679058436"><span class="hs-identifier">pre</span></a></a><span> </span><a name="local-6989586621679058437"><a href="#local-6989586621679058437"><span class="hs-identifier">pOp</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679058438"><span class="hs-identifier hs-var">constraints</span></a><span> </span><a name="line-293"></a><span> </span><span class="hs-operator hs-var"><+/></span><span> </span><a href="#local-6989586621679058436"><span class="hs-identifier hs-var">pre</span></a><span> </span><span class="hs-operator hs-var"></></span><span> </span><a href="#local-6989586621679058442"><span class="hs-identifier hs-var">signatureFold</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">map</span><span> </span><a href="#local-6989586621679058443"><span class="hs-identifier hs-var">attrInput</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">explicitInputAttrs</span><span> </span><a href="#local-6989586621679058437"><span class="hs-identifier hs-var">pOp</span></a><span class="hs-special">)</span><span> </span><a name="line-294"></a><span> </span><span class="hs-operator hs-var">++</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><a href="#local-6989586621679058446"><span class="hs-identifier hs-var">tensorArgAndComment</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">parsedInputs</span><span> </span><a href="#local-6989586621679058437"><span class="hs-identifier hs-var">pOp</span></a><span class="hs-special">)</span><span> </span><a name="line-295"></a><span> </span><span class="hs-operator hs-var">++</span><span> </span><span class="hs-special">[</span><a href="#local-6989586621679058447"><span class="hs-identifier hs-var">outputs</span></a><span class="hs-special">]</span><span class="hs-special">)</span><span> </span><a name="line-296"></a><span> </span><span class="hs-keyword">where</span><span> </span><a name="line-297"></a><span> </span><a name="local-6989586621679058438"><a href="#local-6989586621679058438"><span class="hs-identifier">constraints</span></a></a><span> </span><a name="line-298"></a><span> </span><span class="hs-glyph">|</span><span> </span><span class="hs-identifier hs-var">null</span><span> </span><a href="#local-6989586621679058441"><span class="hs-identifier hs-var">classConstraints</span></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">empty</span><span> </span><a name="line-299"></a><span> </span><span class="hs-glyph">|</span><span> </span><span class="hs-identifier hs-var">otherwise</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"forall"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-identifier hs-var">sep</span><span> </span><a href="#local-6989586621679058439"><span class="hs-identifier hs-var">typeParams</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-string">"."</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-identifier hs-var">tuple</span><span> </span><a href="#local-6989586621679058441"><span class="hs-identifier hs-var">classConstraints</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-string">"=>"</span><span> </span><a name="line-300"></a><span> </span><a name="local-6989586621679058439"><a href="#local-6989586621679058439"><span class="hs-identifier">typeParams</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">[</span><span class="hs-identifier hs-var">strictText</span><span> </span><a href="#local-6989586621679058450"><span class="hs-identifier hs-var">v</span></a><span> </span><span class="hs-glyph">|</span><span> </span><a name="local-6989586621679058449"><a href="#local-6989586621679058449"><span class="hs-identifier">k</span></a></a><span> </span><span class="hs-glyph"><-</span><span> </span><span class="hs-identifier">parsedInputs</span><span> </span><a href="#local-6989586621679058437"><span class="hs-identifier hs-var">pOp</span></a><span> </span><span class="hs-operator hs-var">++</span><span> </span><span class="hs-identifier">parsedOutputs</span><span> </span><a href="#local-6989586621679058437"><span class="hs-identifier hs-var">pOp</span></a><span class="hs-special">,</span><span> </span><a name="line-301"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#ArgSomeTensor"><span class="hs-identifier hs-var">ArgSomeTensor</span></a><span> </span><a name="local-6989586621679058450"><a href="#local-6989586621679058450"><span class="hs-identifier">v</span></a></a><span> </span><span class="hs-glyph"><-</span><span> </span><span class="hs-special">[</span><span class="hs-identifier">argKind</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">parsedArgCase</span><span> </span><a href="#local-6989586621679058449"><span class="hs-identifier hs-var">k</span></a><span class="hs-special">]</span><span class="hs-special">]</span><span> </span><a name="line-302"></a><span> </span><span class="hs-operator hs-var">++</span><span> </span><span class="hs-special">[</span><a href="TensorFlow.OpGen.html#renderHaskellAttrName"><span class="hs-identifier hs-var">renderHaskellAttrName</span></a><span> </span><a href="#local-6989586621679058451"><span class="hs-identifier hs-var">n</span></a><span> </span><span class="hs-glyph">|</span><span> </span><a name="local-6989586621679058451"><a href="#local-6989586621679058451"><span class="hs-identifier">n</span></a></a><span> </span><span class="hs-glyph"><-</span><span> </span><span class="hs-identifier">inferredTypeAttrs</span><span> </span><a href="#local-6989586621679058437"><span class="hs-identifier hs-var">pOp</span></a><span class="hs-special">]</span><span> </span><a name="line-303"></a><span> </span><span class="hs-operator hs-var">++</span><span> </span><span class="hs-keyword">if</span><span> </span><span class="hs-identifier">parsedOpIsMonadic</span><span> </span><a href="#local-6989586621679058437"><span class="hs-identifier hs-var">pOp</span></a><span> </span><span class="hs-keyword">then</span><span> </span><span class="hs-special">[</span><span class="hs-string">"m'"</span><span class="hs-special">]</span><span> </span><span class="hs-keyword">else</span><span> </span><span class="hs-special">[</span><span class="hs-special">]</span><span> </span><a name="line-304"></a><span> </span><span class="hs-comment">-- Use m' as the type parameter to avoid clashing with an attribute name.</span><span> </span><a name="line-305"></a><span> </span><a name="local-6989586621679058440"><a href="#local-6989586621679058440"><span class="hs-identifier">monadConstraint</span></a></a><span> </span><a name="line-306"></a><span> </span><span class="hs-glyph">|</span><span> </span><span class="hs-identifier">parsedOpIsMonadic</span><span> </span><a href="#local-6989586621679058437"><span class="hs-identifier hs-var">pOp</span></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">[</span><span class="hs-string">"MonadBuild m'"</span><span class="hs-special">]</span><span> </span><a name="line-307"></a><span> </span><span class="hs-glyph">|</span><span> </span><span class="hs-identifier hs-var">otherwise</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">[</span><span class="hs-special">]</span><span> </span><a name="line-308"></a><span> </span><a name="local-6989586621679058441"><a href="#local-6989586621679058441"><span class="hs-identifier">classConstraints</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679058440"><span class="hs-identifier hs-var">monadConstraint</span></a><span> </span><span class="hs-operator hs-var">++</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><a href="TensorFlow.OpGen.html#tensorArgConstraint"><span class="hs-identifier hs-var">tensorArgConstraint</span></a><span> </span><a name="line-309"></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">inferredTypeAttrs</span><span> </span><a href="#local-6989586621679058437"><span class="hs-identifier hs-var">pOp</span></a><span class="hs-special">)</span><span> </span><a name="line-310"></a><span> </span><a name="local-6989586621679058442"><a href="#local-6989586621679058442"><span class="hs-identifier">signatureFold</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">folddoc</span><span> </span><span class="hs-special">(</span><span class="hs-glyph">\</span><a name="local-6989586621679058452"><a href="#local-6989586621679058452"><span class="hs-identifier">x</span></a></a><span> </span><a name="local-6989586621679058453"><a href="#local-6989586621679058453"><span class="hs-identifier">y</span></a></a><span> </span><span class="hs-glyph">-></span><span> </span><a href="#local-6989586621679058452"><span class="hs-identifier hs-var">x</span></a><span> </span><span class="hs-operator hs-var"></></span><span> </span><span class="hs-string">"->"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058453"><span class="hs-identifier hs-var">y</span></a><span class="hs-special">)</span><span> </span><a name="line-311"></a><span> </span><a name="local-6989586621679058443"><a href="#local-6989586621679058443"><span class="hs-identifier">attrInput</span></a></a><span> </span><a name="local-6989586621679058454"><a href="#local-6989586621679058454"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679058444"><span class="hs-identifier hs-var">renderAttrType</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">attrInfo</span><span> </span><a href="#local-6989586621679058454"><span class="hs-identifier hs-var">a</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-identifier hs-var">hang</span><span> </span><span class="hs-number">0</span><span> </span><span class="hs-special">(</span><span class="hs-string">"-- ^"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#attrComment"><span class="hs-identifier hs-var">attrComment</span></a><span> </span><a href="#local-6989586621679058454"><span class="hs-identifier hs-var">a</span></a><span class="hs-special">)</span><span> </span><a name="line-312"></a><span> </span><a name="local-6989586621679058444"><a href="#local-6989586621679058444"><span class="hs-identifier">renderAttrType</span></a></a><span> </span><span class="hs-special">(</span><a href="TensorFlow.OpGen.ParsedOp.html#AttrSingle"><span class="hs-identifier hs-var">AttrSingle</span></a><span> </span><a name="local-6989586621679058455"><a href="#local-6989586621679058455"><span class="hs-identifier">a</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679058445"><span class="hs-identifier hs-var">renderAttrBaseType</span></a><span> </span><a href="#local-6989586621679058455"><span class="hs-identifier hs-var">a</span></a><span> </span><a name="line-313"></a><span> </span><span class="hs-identifier">renderAttrType</span><span> </span><span class="hs-special">(</span><a href="TensorFlow.OpGen.ParsedOp.html#AttrList"><span class="hs-identifier hs-var">AttrList</span></a><span> </span><a name="local-6989586621679058456"><a href="#local-6989586621679058456"><span class="hs-identifier">a</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">brackets</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="#local-6989586621679058445"><span class="hs-identifier hs-var">renderAttrBaseType</span></a><span> </span><a href="#local-6989586621679058456"><span class="hs-identifier hs-var">a</span></a><span> </span><a name="line-314"></a><span> </span><a name="local-6989586621679058445"><a href="#local-6989586621679058445"><span class="hs-identifier">renderAttrBaseType</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-glyph">\</span><span class="hs-keyword">case</span><span> </span><a name="line-315"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#AttrBytes"><span class="hs-identifier hs-var">AttrBytes</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-string">"ByteString"</span><span> </span><a name="line-316"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#AttrInt64"><span class="hs-identifier hs-var">AttrInt64</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-string">"Data.Int.Int64"</span><span> </span><a name="line-317"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#AttrFloat"><span class="hs-identifier hs-var">AttrFloat</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-string">"Float"</span><span> </span><a name="line-318"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#AttrBool"><span class="hs-identifier hs-var">AttrBool</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-string">"Bool"</span><span> </span><a name="line-319"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#AttrType"><span class="hs-identifier hs-var">AttrType</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-string">"DataType"</span><span> </span><a name="line-320"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#AttrShape"><span class="hs-identifier hs-var">AttrShape</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-string">"Shape"</span><span> </span><a name="line-321"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#AttrTensor"><span class="hs-identifier hs-var">AttrTensor</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-string">"TensorProto"</span><span> </span><a name="line-322"></a><span> </span><a name="line-323"></a><span> </span><a name="local-6989586621679058446"><a href="#local-6989586621679058446"><span class="hs-identifier">tensorArgAndComment</span></a></a><span> </span><a name="local-6989586621679058457"><a href="#local-6989586621679058457"><span class="hs-identifier">t</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="TensorFlow.OpGen.html#tensorArg"><span class="hs-identifier hs-var">tensorArg</span></a><span> </span><a href="#local-6989586621679058457"><span class="hs-identifier hs-var">t</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-identifier hs-var">hang</span><span> </span><span class="hs-number">0</span><span> </span><span class="hs-special">(</span><span class="hs-string">"-- ^"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#argComment"><span class="hs-identifier hs-var">argComment</span></a><span> </span><a href="#local-6989586621679058457"><span class="hs-identifier hs-var">t</span></a><span class="hs-special">)</span><span> </span><a name="line-324"></a><span> </span><a name="local-6989586621679058447"><a href="#local-6989586621679058447"><span class="hs-identifier">outputs</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">case</span><span> </span><span class="hs-identifier">parsedOutputs</span><span> </span><a href="#local-6989586621679058437"><span class="hs-identifier hs-var">pOp</span></a><span> </span><span class="hs-keyword">of</span><span> </span><a name="line-325"></a><span> </span><span class="hs-special">[</span><span class="hs-special">]</span><span> </span><span class="hs-glyph">-></span><span> </span><a href="#local-6989586621679058448"><span class="hs-identifier hs-var">wrapOutput</span></a><span> </span><span class="hs-string">"ControlNode"</span><span> </span><a name="line-326"></a><span> </span><span class="hs-comment">-- TODO(judahjacobson): To improve indentation: `tensorArgAndComment a`</span><span> </span><a name="line-327"></a><span> </span><span class="hs-special">[</span><a name="local-6989586621679058458"><a href="#local-6989586621679058458"><span class="hs-identifier">a</span></a></a><span class="hs-special">]</span><span> </span><span class="hs-glyph">-></span><span> </span><a href="#local-6989586621679058448"><span class="hs-identifier hs-var">wrapOutput</span></a><span> </span><span class="hs-special">(</span><a href="TensorFlow.OpGen.html#tensorArg"><span class="hs-identifier hs-var">tensorArg</span></a><span> </span><a href="#local-6989586621679058458"><span class="hs-identifier hs-var">a</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-string">"-- ^"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#argComment"><span class="hs-identifier hs-var">argComment</span></a><span> </span><a href="#local-6989586621679058458"><span class="hs-identifier hs-var">a</span></a><span> </span><a name="line-328"></a><span> </span><span class="hs-keyword">as</span><span> </span><span class="hs-glyph">-></span><span> </span><a href="#local-6989586621679058448"><span class="hs-identifier hs-var">wrapOutput</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">tuple</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">map</span><span> </span><a href="TensorFlow.OpGen.html#tensorArg"><span class="hs-identifier hs-var">tensorArg</span></a><span> </span><span class="hs-keyword">as</span><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var"><+/></span><span> </span><a href="TensorFlow.OpGen.html#resultComment"><span class="hs-identifier hs-var">resultComment</span></a><span> </span><span class="hs-keyword">as</span><span> </span><a name="line-329"></a><span> </span><a name="local-6989586621679058448"><a href="#local-6989586621679058448"><span class="hs-identifier">wrapOutput</span></a></a><span> </span><a name="local-6989586621679058460"><a href="#local-6989586621679058460"><span class="hs-identifier">o</span></a></a><span> </span><a name="line-330"></a><span> </span><span class="hs-glyph">|</span><span> </span><span class="hs-identifier">parsedOpIsMonadic</span><span> </span><a href="#local-6989586621679058437"><span class="hs-identifier hs-var">pOp</span></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"m'"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-identifier hs-var">parens</span><span> </span><a href="#local-6989586621679058460"><span class="hs-identifier hs-var">o</span></a><span> </span><a name="line-331"></a><span> </span><span class="hs-glyph">|</span><span> </span><span class="hs-identifier hs-var">otherwise</span><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679058460"><span class="hs-identifier hs-var">o</span></a><span> </span><a name="line-332"></a><span> </span><a name="line-333"></a><span class="hs-comment">-- | Render an op input or output.</span><span> </span><a name="line-334"></a><span class="hs-comment">-- For example: "Tensor Ref Int64", "Tensor v t"</span><span> </span><a name="line-335"></a><span class="hs-identifier">tensorArg</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#ParsedArg"><span class="hs-identifier hs-type">ParsedArg</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-336"></a><a name="tensorArg"><a href="TensorFlow.OpGen.html#tensorArg"><span class="hs-identifier">tensorArg</span></a></a><span> </span><a name="local-6989586621679058461"><a href="#local-6989586621679058461"><span class="hs-identifier">p</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">case</span><span> </span><span class="hs-identifier">parsedArgCase</span><span> </span><a href="#local-6989586621679058461"><span class="hs-identifier hs-var">p</span></a><span> </span><span class="hs-keyword">of</span><span> </span><a name="line-337"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#SimpleArg"><span class="hs-identifier hs-var">SimpleArg</span></a><span> </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">argType</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679058471"><a href="#local-6989586621679058471"><span class="hs-identifier">t</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">argKind</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679058472"><a href="#local-6989586621679058472"><span class="hs-identifier">k</span></a></a><span> </span><span class="hs-special">}</span><span> </span><span class="hs-glyph">-></span><span> </span><a href="#local-6989586621679058463"><span class="hs-identifier hs-var">tensorType</span></a><span> </span><a href="#local-6989586621679058471"><span class="hs-identifier hs-var">t</span></a><span> </span><a href="#local-6989586621679058472"><span class="hs-identifier hs-var">k</span></a><span> </span><a name="line-338"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#ListArg"><span class="hs-identifier hs-var">ListArg</span></a><span> </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">argType</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679058473"><a href="#local-6989586621679058473"><span class="hs-identifier">t</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">argKind</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679058474"><a href="#local-6989586621679058474"><span class="hs-identifier">k</span></a></a><span> </span><span class="hs-special">}</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-var">brackets</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="#local-6989586621679058463"><span class="hs-identifier hs-var">tensorType</span></a><span> </span><a href="#local-6989586621679058473"><span class="hs-identifier hs-var">t</span></a><span> </span><a href="#local-6989586621679058474"><span class="hs-identifier hs-var">k</span></a><span> </span><a name="line-339"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#MixedListArg"><span class="hs-identifier hs-var">MixedListArg</span></a><span> </span><span class="hs-special">{</span><span class="hs-identifier">argTypeAttr</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679058475"><a href="#local-6989586621679058475"><span class="hs-identifier">t</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">argKind</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679058476"><a href="#local-6989586621679058476"><span class="hs-identifier">k</span></a></a><span class="hs-special">}</span><span> </span><a name="line-340"></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-string">"TensorList"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-identifier hs-var">parens</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679058462"><span class="hs-identifier hs-var">kind</span></a><span> </span><a href="#local-6989586621679058476"><span class="hs-identifier hs-var">k</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#renderHaskellName"><span class="hs-identifier hs-var">renderHaskellName</span></a><span> </span><a href="#local-6989586621679058475"><span class="hs-identifier hs-var">t</span></a><span> </span><a name="line-341"></a><span> </span><span class="hs-keyword">where</span><span> </span><a name="line-342"></a><span> </span><a name="local-6989586621679058462"><a href="#local-6989586621679058462"><span class="hs-identifier">kind</span></a></a><span> </span><a name="local-6989586621679058464"><a href="#local-6989586621679058464"><span class="hs-identifier">k</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">case</span><span> </span><a href="#local-6989586621679058464"><span class="hs-identifier hs-var">k</span></a><span> </span><span class="hs-keyword">of</span><span> </span><a name="line-343"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#ArgTensorRef"><span class="hs-identifier hs-var">ArgTensorRef</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-string">"Ref"</span><span> </span><a name="line-344"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#ArgTensorValue"><span class="hs-identifier hs-var">ArgTensorValue</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-string">"Value"</span><span> </span><a name="line-345"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#ArgTensorBuild"><span class="hs-identifier hs-var">ArgTensorBuild</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-string">"Build"</span><span> </span><a name="line-346"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#ArgSomeTensor"><span class="hs-identifier hs-var">ArgSomeTensor</span></a><span> </span><a name="local-6989586621679058465"><a href="#local-6989586621679058465"><span class="hs-identifier">v</span></a></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-var">strictText</span><span> </span><a href="#local-6989586621679058465"><span class="hs-identifier hs-var">v</span></a><span> </span><a name="line-347"></a><span> </span><a name="local-6989586621679058463"><a href="#local-6989586621679058463"><span class="hs-identifier">tensorType</span></a></a><span> </span><a name="local-6989586621679058466"><a href="#local-6989586621679058466"><span class="hs-identifier">t</span></a></a><span> </span><a name="local-6989586621679058467"><a href="#local-6989586621679058467"><span class="hs-identifier">k</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">let</span><span> </span><a name="line-348"></a><span> </span><a name="local-6989586621679058468"><a href="#local-6989586621679058468"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">case</span><span> </span><a href="#local-6989586621679058466"><span class="hs-identifier hs-var">t</span></a><span> </span><span class="hs-keyword">of</span><span> </span><a name="line-349"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#ArgTypeFixed"><span class="hs-identifier hs-var">ArgTypeFixed</span></a><span> </span><a name="local-6989586621679058469"><a href="#local-6989586621679058469"><span class="hs-identifier">dt</span></a></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-var">strictText</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="TensorFlow.OpGen.html#dtTypeToHaskell"><span class="hs-identifier hs-var">dtTypeToHaskell</span></a><span> </span><a href="#local-6989586621679058469"><span class="hs-identifier hs-var">dt</span></a><span> </span><a name="line-350"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#ArgTypeAttr"><span class="hs-identifier hs-var">ArgTypeAttr</span></a><span> </span><a name="local-6989586621679058470"><a href="#local-6989586621679058470"><span class="hs-identifier">n</span></a></a><span> </span><span class="hs-glyph">-></span><span> </span><a href="TensorFlow.OpGen.html#renderHaskellName"><span class="hs-identifier hs-var">renderHaskellName</span></a><span> </span><a href="#local-6989586621679058470"><span class="hs-identifier hs-var">n</span></a><span> </span><a name="line-351"></a><span> </span><span class="hs-keyword">in</span><span> </span><span class="hs-string">"Tensor"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058462"><span class="hs-identifier hs-var">kind</span></a><span> </span><a href="#local-6989586621679058467"><span class="hs-identifier hs-var">k</span></a><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058468"><span class="hs-identifier hs-var">a</span></a><span> </span><a name="line-352"></a><span> </span><a name="line-353"></a><span class="hs-identifier">attrComment</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#Attr"><span class="hs-identifier hs-type">Attr</span></a><span> </span><a href="#local-6989586621679056605"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-354"></a><a name="attrComment"><a href="TensorFlow.OpGen.html#attrComment"><span class="hs-identifier">attrComment</span></a></a><span> </span><a name="local-6989586621679058477"><a href="#local-6989586621679058477"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="TensorFlow.OpGen.html#argComment%27"><span class="hs-identifier hs-var">argComment'</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">attrName</span><span> </span><a href="#local-6989586621679058477"><span class="hs-identifier hs-var">a</span></a><span class="hs-special">)</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">attrDescription</span><span> </span><a href="#local-6989586621679058477"><span class="hs-identifier hs-var">a</span></a><span class="hs-special">)</span><span> </span><a name="line-355"></a><span> </span><a name="line-356"></a><span class="hs-identifier">argComment</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#ParsedArg"><span class="hs-identifier hs-type">ParsedArg</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-357"></a><a name="argComment"><a href="TensorFlow.OpGen.html#argComment"><span class="hs-identifier">argComment</span></a></a><span> </span><a name="local-6989586621679058478"><a href="#local-6989586621679058478"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="TensorFlow.OpGen.html#argComment%27"><span class="hs-identifier hs-var">argComment'</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">parsedArgName</span><span> </span><a href="#local-6989586621679058478"><span class="hs-identifier hs-var">a</span></a><span class="hs-special">)</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">parsedArgDescription</span><span> </span><a href="#local-6989586621679058478"><span class="hs-identifier hs-var">a</span></a><span class="hs-special">)</span><span> </span><a name="line-358"></a><span> </span><a name="line-359"></a><span class="hs-identifier">argComment'</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#Name"><span class="hs-identifier hs-type">Name</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Text</span><span class="hs-operator hs-type">.</span><span class="hs-identifier hs-type">Text</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-360"></a><a name="argComment%27"><a href="TensorFlow.OpGen.html#argComment%27"><span class="hs-identifier">argComment'</span></a></a><span> </span><a name="local-6989586621679058479"><a href="#local-6989586621679058479"><span class="hs-identifier">argName</span></a></a><span> </span><a name="local-6989586621679058480"><a href="#local-6989586621679058480"><span class="hs-identifier">argDesc</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a name="line-361"></a><span> </span><a href="TensorFlow.OpGen.html#bold"><span class="hs-identifier hs-var">bold</span></a><span> </span><span class="hs-special">(</span><a href="TensorFlow.OpGen.html#renderTFName"><span class="hs-identifier hs-var">renderTFName</span></a><span> </span><a href="#local-6989586621679058479"><span class="hs-identifier hs-var">argName</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var"><></span><span> </span><a href="TensorFlow.OpGen.html#splitMultilineText"><span class="hs-identifier hs-var">splitMultilineText</span></a><span> </span><span class="hs-special">(</span><span class="hs-string">":"</span><span> </span><span class="hs-operator hs-var"><+></span><span class="hs-special">)</span><span> </span><a href="#local-6989586621679058480"><span class="hs-identifier hs-var">argDesc</span></a><span> </span><a name="line-362"></a><span> </span><a name="line-363"></a><span class="hs-identifier">bold</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-364"></a><a name="bold"><a href="TensorFlow.OpGen.html#bold"><span class="hs-identifier">bold</span></a></a><span> </span><a name="local-6989586621679058481"><a href="#local-6989586621679058481"><span class="hs-identifier">n</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"__"</span><span> </span><span class="hs-operator hs-var"><></span><span> </span><a href="#local-6989586621679058481"><span class="hs-identifier hs-var">n</span></a><span> </span><span class="hs-operator hs-var"><></span><span> </span><span class="hs-string">"__"</span><span> </span><a name="line-365"></a><span> </span><a name="line-366"></a><span class="hs-comment">-- | Comment for the outputs of an op.</span><span> </span><a name="line-367"></a><span class="hs-comment">-- For example:</span><span> </span><a name="line-368"></a><span class="hs-comment">-- -- ^ (__output1__, __output2__)</span><span> </span><a name="line-369"></a><span class="hs-comment">-- --</span><span> </span><a name="line-370"></a><span class="hs-comment">-- -- * __output1__: description1</span><span> </span><a name="line-371"></a><span class="hs-comment">-- --</span><span> </span><a name="line-372"></a><span class="hs-comment">-- -- * __output2__: description2</span><span> </span><a name="line-373"></a><span class="hs-identifier">resultComment</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">[</span><a href="TensorFlow.OpGen.ParsedOp.html#ParsedArg"><span class="hs-identifier hs-type">ParsedArg</span></a><span class="hs-special">]</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-374"></a><a name="resultComment"><a href="TensorFlow.OpGen.html#resultComment"><span class="hs-identifier">resultComment</span></a></a><span> </span><a name="local-6989586621679058482"><a href="#local-6989586621679058482"><span class="hs-identifier">os</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">stack</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">flatten</span><span> </span><a href="#local-6989586621679058483"><span class="hs-identifier hs-var">commentSummary</span></a><span> </span><span class="hs-glyph">:</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><a href="#local-6989586621679058484"><span class="hs-identifier hs-var">commentDetails</span></a><span> </span><a href="#local-6989586621679058482"><span class="hs-identifier hs-var">os</span></a><span> </span><a name="line-375"></a><span> </span><span class="hs-keyword">where</span><span> </span><a name="line-376"></a><span> </span><a name="local-6989586621679058483"><a href="#local-6989586621679058483"><span class="hs-identifier">commentSummary</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"-- ^"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><span class="hs-identifier hs-var">tuple</span><span> </span><span class="hs-special">[</span><a href="TensorFlow.OpGen.html#bold"><span class="hs-identifier hs-var">bold</span></a><span> </span><span class="hs-special">(</span><a href="TensorFlow.OpGen.html#renderTFName"><span class="hs-identifier hs-var">renderTFName</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">parsedArgName</span><span> </span><a href="#local-6989586621679058485"><span class="hs-identifier hs-var">o</span></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">|</span><span> </span><a name="local-6989586621679058485"><a href="#local-6989586621679058485"><span class="hs-identifier">o</span></a></a><span> </span><span class="hs-glyph"><-</span><span> </span><a href="#local-6989586621679058482"><span class="hs-identifier hs-var">os</span></a><span class="hs-special">]</span><span> </span><a name="line-377"></a><span> </span><a name="local-6989586621679058484"><a href="#local-6989586621679058484"><span class="hs-identifier">commentDetails</span></a></a><span> </span><a name="local-6989586621679058486"><a href="#local-6989586621679058486"><span class="hs-identifier">o</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a name="line-378"></a><span> </span><span class="hs-identifier hs-var">stack</span><span> </span><span class="hs-special">[</span><span> </span><span class="hs-string">"--"</span><span> </span><a name="line-379"></a><span> </span><span class="hs-special">,</span><span> </span><span class="hs-string">"-- *"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="TensorFlow.OpGen.html#argComment"><span class="hs-identifier hs-var">argComment</span></a><span> </span><a href="#local-6989586621679058486"><span class="hs-identifier hs-var">o</span></a><span> </span><a name="line-380"></a><span> </span><span class="hs-special">]</span><span> </span><a name="line-381"></a><span> </span><a name="line-382"></a><span class="hs-comment">-- | Constraints for a given type parameter.</span><span> </span><a name="line-383"></a><span class="hs-comment">-- E.g.: "TensorType t" or "OneOf [Int64, Float] t"</span><span> </span><a name="line-384"></a><span class="hs-comment">-- or "TensorTypes ts" or "OneOfs [..] ts".</span><span> </span><a name="line-385"></a><span class="hs-identifier">tensorArgConstraint</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#Attr"><span class="hs-identifier hs-type">Attr</span></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#TypeParam"><span class="hs-identifier hs-type">TypeParam</span></a><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-386"></a><a name="tensorArgConstraint"><a href="TensorFlow.OpGen.html#tensorArgConstraint"><span class="hs-identifier">tensorArgConstraint</span></a></a><span> </span><a name="local-6989586621679058487"><a href="#local-6989586621679058487"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">case</span><span> </span><span class="hs-identifier">attrInfo</span><span> </span><a href="#local-6989586621679058487"><span class="hs-identifier hs-var">a</span></a><span> </span><span class="hs-keyword">of</span><span> </span><a name="line-387"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#TypeParam"><span class="hs-identifier hs-var">TypeParam</span></a><span> </span><span class="hs-identifier hs-var">False</span><span> </span><span class="hs-identifier hs-var">Nothing</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-string">"TensorType"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058488"><span class="hs-identifier hs-var">n</span></a><span> </span><a name="line-388"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#TypeParam"><span class="hs-identifier hs-var">TypeParam</span></a><span> </span><span class="hs-identifier hs-var">False</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">Just</span><span> </span><span class="hs-keyword">as</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-string">"OneOf"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058489"><span class="hs-identifier hs-var">typeList</span></a><span> </span><span class="hs-keyword">as</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058488"><span class="hs-identifier hs-var">n</span></a><span> </span><a name="line-389"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#TypeParam"><span class="hs-identifier hs-var">TypeParam</span></a><span> </span><span class="hs-identifier hs-var">True</span><span> </span><span class="hs-identifier hs-var">Nothing</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-string">"TensorTypes"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058488"><span class="hs-identifier hs-var">n</span></a><span> </span><a name="line-390"></a><span> </span><a href="TensorFlow.OpGen.ParsedOp.html#TypeParam"><span class="hs-identifier hs-var">TypeParam</span></a><span> </span><span class="hs-identifier hs-var">True</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">Just</span><span> </span><span class="hs-keyword">as</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-string">"OneOfs"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058489"><span class="hs-identifier hs-var">typeList</span></a><span> </span><span class="hs-keyword">as</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058488"><span class="hs-identifier hs-var">n</span></a><span> </span><a name="line-391"></a><span> </span><span class="hs-keyword">where</span><span> </span><a name="line-392"></a><span> </span><a name="local-6989586621679058488"><a href="#local-6989586621679058488"><span class="hs-identifier">n</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="TensorFlow.OpGen.html#renderHaskellAttrName"><span class="hs-identifier hs-var">renderHaskellAttrName</span></a><span> </span><a href="#local-6989586621679058487"><span class="hs-identifier hs-var">a</span></a><span> </span><a name="line-393"></a><span> </span><span class="hs-comment">-- Produces a type-level list, e.g.: '[Int32,Int64,Float]</span><span> </span><a name="line-394"></a><span> </span><a name="local-6989586621679058489"><a href="#local-6989586621679058489"><span class="hs-identifier">typeList</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">(</span><span class="hs-string">"'"</span><span> </span><span class="hs-operator hs-var"><></span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">brackets</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">commasep</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><span class="hs-identifier hs-var">strictText</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><a name="line-395"></a><span> </span><span class="hs-identifier hs-var">Set</span><span class="hs-operator hs-var">.</span><span class="hs-identifier hs-var">toList</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">Set</span><span class="hs-operator hs-var">.</span><span class="hs-identifier hs-var">fromList</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><a name="line-396"></a><span> </span><span class="hs-identifier hs-var">map</span><span> </span><a href="TensorFlow.OpGen.html#dtTypeToHaskell"><span class="hs-identifier hs-var">dtTypeToHaskell</span></a><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">toList</span><span> </span><a name="line-397"></a><span> </span><a name="line-398"></a><span class="hs-comment">-- NOTE: The cases of this function should be kept in sync with</span><span> </span><a name="line-399"></a><span class="hs-comment">-- TensorFlow.Types.AllTensorTypes.</span><span> </span><a name="line-400"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">DataType</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Text</span><span class="hs-operator hs-type">.</span><span class="hs-identifier hs-type">Text</span><span> </span><a name="line-401"></a><a name="dtTypeToHaskell"><a href="TensorFlow.OpGen.html#dtTypeToHaskell"><span class="hs-identifier">dtTypeToHaskell</span></a></a><span> </span><span class="hs-identifier hs-var">DT_BOOL</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Bool"</span><span> </span><a name="line-402"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_BFLOAT16</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Data.Word.Word16"</span><span> </span><a name="line-403"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_COMPLEX128</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"(Data.Complex.Complex Double)"</span><span> </span><a name="line-404"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_COMPLEX64</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"(Data.Complex.Complex Float)"</span><span> </span><a name="line-405"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_DOUBLE</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Double"</span><span> </span><a name="line-406"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_FLOAT</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Float"</span><span> </span><a name="line-407"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_INT16</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Data.Int.Int16"</span><span> </span><a name="line-408"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_INT32</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Data.Int.Int32"</span><span> </span><a name="line-409"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_INT64</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Data.Int.Int64"</span><span> </span><a name="line-410"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_INT8</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Data.Int.Int8"</span><span> </span><a name="line-411"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_QINT32</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Data.Int.Int32"</span><span> </span><span class="hs-comment">-- TODO(gnezdo): make unique</span><span> </span><a name="line-412"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_QINT8</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Data.Word.Word8"</span><span> </span><span class="hs-comment">-- TODO(gnezdo): make unique</span><span> </span><a name="line-413"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_QINT16</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Data.Int.Int16"</span><span> </span><span class="hs-comment">-- TODO(gnezdo): make unique</span><span> </span><a name="line-414"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_QUINT16</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Data.Word.Word16"</span><span> </span><span class="hs-comment">-- TODO(gnezdo): make unique</span><span> </span><a name="line-415"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_QUINT8</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Data.Word.Word8"</span><span> </span><span class="hs-comment">-- TODO(gnezdo): make unique</span><span> </span><a name="line-416"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_STRING</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Data.ByteString.ByteString"</span><span> </span><a name="line-417"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_UINT16</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Data.Word.Word16"</span><span> </span><a name="line-418"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_HALF</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Data.Word.Word16"</span><span> </span><span class="hs-comment">-- TODO(gnezdo): make unique</span><span> </span><a name="line-419"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_UINT8</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"Data.Word.Word8"</span><span> </span><a name="line-420"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><span class="hs-identifier hs-var">DT_RESOURCE</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"ResourceHandle"</span><span> </span><a name="line-421"></a><span class="hs-identifier">dtTypeToHaskell</span><span> </span><a name="local-6989586621679058492"><a href="#local-6989586621679058492"><span class="hs-identifier">x</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a name="line-422"></a><span> </span><span class="hs-identifier hs-var">Text</span><span class="hs-operator hs-var">.</span><span class="hs-identifier hs-var">pack</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-string">"Unsupported type in dtTypeToHaskell: "</span><span> </span><span class="hs-operator hs-var">++</span><span> </span><span class="hs-identifier hs-var">show</span><span> </span><a href="#local-6989586621679058492"><span class="hs-identifier hs-var">x</span></a><span> </span><a name="line-423"></a><span> </span><a name="line-424"></a><span class="hs-comment">-- | haddockComment escapes TensorFlow doc strings into haddock.</span><span> </span><a name="line-425"></a><span class="hs-comment">-- TODO(gnezdo): deal with the markup.</span><span> </span><a name="line-426"></a><span class="hs-identifier">haddockComment</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Text</span><span class="hs-operator hs-type">.</span><span class="hs-identifier hs-type">Text</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-427"></a><a name="haddockComment"><a href="TensorFlow.OpGen.html#haddockComment"><span class="hs-identifier">haddockComment</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">strictText</span><span> </span><a name="line-428"></a><span> </span><a name="line-429"></a><span class="hs-comment">-- | Generate a multiline comment. For example:</span><span> </span><a name="line-430"></a><span class="hs-comment">-- summary'</span><span> </span><a name="line-431"></a><span class="hs-comment">-- --</span><span> </span><a name="line-432"></a><span class="hs-comment">-- -- detail_line1</span><span> </span><a name="line-433"></a><span class="hs-comment">-- -- detail_line2</span><span> </span><a name="line-434"></a><span class="hs-comment">-- -- ...</span><span> </span><a name="line-435"></a><span class="hs-identifier">multilineComment</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Text</span><span class="hs-operator hs-type">.</span><span class="hs-identifier hs-type">Text</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Text</span><span class="hs-operator hs-type">.</span><span class="hs-identifier hs-type">Text</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-436"></a><a name="multilineComment"><a href="TensorFlow.OpGen.html#multilineComment"><span class="hs-identifier">multilineComment</span></a></a><span> </span><a name="local-6989586621679058493"><a href="#local-6989586621679058493"><span class="hs-identifier">summary'</span></a></a><span> </span><a name="local-6989586621679058494"><a href="#local-6989586621679058494"><span class="hs-identifier">detail</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a name="line-437"></a><span> </span><a href="TensorFlow.OpGen.html#haddockComment"><span class="hs-identifier hs-var">haddockComment</span></a><span> </span><a href="#local-6989586621679058493"><span class="hs-identifier hs-var">summary'</span></a><span> </span><span class="hs-operator hs-var"></></span><span> </span><a name="line-438"></a><span> </span><a href="TensorFlow.OpGen.html#splitMultilineText"><span class="hs-identifier hs-var">splitMultilineText</span></a><span> </span><a href="#local-6989586621679058495"><span class="hs-identifier hs-var">insertParagraphAndComment</span></a><span> </span><a href="#local-6989586621679058494"><span class="hs-identifier hs-var">detail</span></a><span> </span><a name="line-439"></a><span> </span><span class="hs-keyword">where</span><span> </span><a name="local-6989586621679058495"><a href="#local-6989586621679058495"><span class="hs-identifier">insertParagraphAndComment</span></a></a><span> </span><a name="local-6989586621679058496"><a href="#local-6989586621679058496"><span class="hs-identifier">x</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">"--"</span><span> </span><span class="hs-operator hs-var"></></span><span> </span><span class="hs-string">"--"</span><span> </span><span class="hs-operator hs-var"><+></span><span> </span><a href="#local-6989586621679058496"><span class="hs-identifier hs-var">x</span></a><span> </span><a name="line-440"></a><span> </span><a name="line-441"></a><span class="hs-comment">-- | Converts the given multi-line detail string into</span><span> </span><a name="line-442"></a><span class="hs-comment">-- a multi-line haddock. Applies the given lead to the</span><span> </span><a name="line-443"></a><span class="hs-comment">-- first line. Returns an empty document for empty detail.</span><span> </span><a name="line-444"></a><span class="hs-identifier">splitMultilineText</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Doc</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Text</span><span class="hs-operator hs-type">.</span><span class="hs-identifier hs-type">Text</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-type">Doc</span><span> </span><a name="line-445"></a><a name="splitMultilineText"><a href="TensorFlow.OpGen.html#splitMultilineText"><span class="hs-identifier">splitMultilineText</span></a></a><span> </span><a name="local-6989586621679058497"><a href="#local-6989586621679058497"><span class="hs-identifier">lead</span></a></a><span> </span><a name="local-6989586621679058498"><a href="#local-6989586621679058498"><span class="hs-identifier">detail</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a name="line-446"></a><span> </span><span class="hs-keyword">case</span><span> </span><span class="hs-identifier hs-var">Text</span><span class="hs-operator hs-var">.</span><span class="hs-identifier hs-var">lines</span><span> </span><a href="#local-6989586621679058498"><span class="hs-identifier hs-var">detail</span></a><span> </span><span class="hs-keyword">of</span><span> </span><a name="line-447"></a><span> </span><span class="hs-special">[</span><span class="hs-special">]</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-var">empty</span><span> </span><a name="line-448"></a><span> </span><span class="hs-special">(</span><a name="local-6989586621679058499"><a href="#local-6989586621679058499"><span class="hs-identifier">l</span></a></a><span> </span><span class="hs-glyph">:</span><span> </span><a name="local-6989586621679058500"><a href="#local-6989586621679058500"><span class="hs-identifier">ls</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">-></span><span> </span><span class="hs-identifier hs-var">stack</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="#local-6989586621679058497"><span class="hs-identifier hs-var">lead</span></a><span> </span><span class="hs-special">(</span><a href="TensorFlow.OpGen.html#haddockComment"><span class="hs-identifier hs-var">haddockComment</span></a><span> </span><a href="#local-6989586621679058499"><span class="hs-identifier hs-var">l</span></a><span class="hs-special">)</span><span> </span><a name="line-449"></a><span> </span><span class="hs-glyph">:</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-string">"--"</span><span> </span><span class="hs-operator hs-var"><+></span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><a href="TensorFlow.OpGen.html#haddockComment"><span class="hs-identifier hs-var">haddockComment</span></a><span class="hs-special">)</span><span> </span><a href="#local-6989586621679058500"><span class="hs-identifier hs-var">ls</span></a><span> </span><a name="line-450"></a><span> </span><a name="line-451"></a><span class="hs-identifier">indentation</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Int</span><span> </span><a name="line-452"></a><a name="indentation"><a href="TensorFlow.OpGen.html#indentation"><span class="hs-identifier">indentation</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-number">4</span><span> </span><a name="line-453"></a></pre></body></html>