2015-03-21 4 views
0

Я хотел бы создать форму в Elm, который принимает 4 необходимых входов:Создание формы с Elm

  • 3 с плавающей точкой ЗНАЧЕНИЯ
  • 1 вход, который может принимать значения «длинный» или «короткий "(предположительно) это будет раскрывающийся список

Когда введены значения, выполняется вычисление, которое дает одну строку вывода на основе этих значений.

У меня это работает как программа Python командной строки:

#!/usr/bin/env python 


from __future__ import print_function 

# core 
import logging 

# pypi 
import argh 

# local 

logging.basicConfig(
    format='%(lineno)s %(message)s', 
    level=logging.WARN 
) 

def main(direction, entry, swing, atr): 

    entry = float(entry) 
    swing = float(swing) 
    atr = float(atr) 

    if direction == 'long': 
     sl = swing - atr 
     tp = entry + (2 * atr) 
    elif direction == 'short': 
     sl = swing + atr 
     tp = entry - (2 * atr) 

    print("For {0} on an entry of {1}, SL={2} and TP={3}".format(
     direction, entry, sl, tp)) 

if __name__ == '__main__': 
    argh.dispatch_command(main) 

но хотите использовать Elm, чтобы создать веб-интерфейс для него.

+2

Итак, в чем вопрос? – Apanatshka

ответ

2

Это не идеальное первое введение в Elm, так как оно захватывает вас в нескольких сложных зонах Вяма: почтовых ящиках и библиотеке Graphics.Input. Кроме того, нет ввода данных с простым в развертывании, поэтому я применил только раскрывающийся список; вы должны использовать Graphics.Input.Field (который может стать особенно рискованным).

Почтовый ящик - это в основном сигнал о том, что выпадающий вход может отправить сообщение. Я выбрал для этого сообщения функцию, в частности, как создать новое состояние из старого. Мы определяем состояние как тип записи (например, Python с именем tuple), поэтому сохранение направления предполагает сохранение нового направления в записи.

Текст визуализируется с использованием функции удобства, которая делает ее monospace. Есть целый text library, который вы можете использовать, но Elm 0.15 не имеет строковой интерполяции, поэтому вы застряли с довольно уродливыми дополнениями.

И, наконец, в сообществе Elm не так много, но вы можете присоединиться к mailing list, где такие вопросы приветствуются. При этом вам следует попытаться погрузиться в Вяз и изучить основы, чтобы вы могли задать более конкретный вопрос. Это касается практически любого языка, библиотеки или структуры - перед тем, как написать «полезный» код, вам нужно выполнить некоторые основные упражнения.

import Graphics.Input as Input 
import Graphics.Element as Element exposing (Element) 

mailbox = Signal.mailbox identity 

type Direction = Short | Long 
type alias State = {entry : Float, swing : Float, atr : Float, dir : Direction} 

initialState : State 
initialState = State 0 0 0 Short 

dropdown : Element 
dropdown = 
    Input.dropDown 
    (\dir -> Signal.message mailbox.address (\state -> {state| dir <- dir})) 
    [("Short", Short), ("Long", Long)] 

state : Signal State 
state = Signal.foldp (<|) initialState mailbox.signal 

render : State -> Element 
render state = 
    dropdown `Element.above` 
    Element.show ("For "++(toString state.dir)++" on an entry of "++(toString state.entry) ++ 
        ", SL="++(toString (sl state))++" and TP="++(toString (tp state))) 

main = Signal.map render state 

-- the good news: these are separate, pure functions 
sl {entry, swing, atr, dir} = 
    case dir of 
     Long -> swing - atr 
     Short -> swing + atr 

tp {entry, swing, atr, dir} = 
    case dir of 
     Long -> entry + (2*atr) 
     Short -> entry - (2*atr) 

Обновление: Я написал an essay на почтовые ящики и как использовать их.