AMcoder - javascript, python, java, html, php, sql

Haskell ֆունկցիայի կազմը

Ես սահմանել եմ f1 և f2 ֆունկցիաներ, որպեսզի կարողանամ օգտագործել և ֆունկցիայի կազմը (fkomp), որը պետք է օգտագործի f1 և f2՝ տվյալ Ցուցակի յուրաքանչյուր տարրով 2^x-ը հաշվարկելու համար:

f1 :: Int -> Int 
f1 x = product (replicate x 2)

f2 :: (a -> b) -> [a] -> [b]
f2 f xs = [f x | x <- xs]

fkomp :: [Int] -> [Int]        
fkomp xs = f2 f1 $ xs 

Այն աշխատում է, բայց խնդիրն այն է, որ ես չեմ կարող գրել իմ կոդը կոմպոզիցիայով.

fkomp xs = f2.f1 $ xs

Ես մուտքագրել եմ յուրաքանչյուր համակցություն, բայց այն չի աշխատում կոմպոզիցիայի հետ:

Կարո՞ղ է ինչ-որ մեկը լուսավորել իմ ճանապարհը:

Շատ շնորհակալություն


  • Ո՞ւմ եք անվանում Ասենա: 23.06.2015
  • @AaditMShah ... Ես կռահում եմ, որ նա ինքն է ;) 23.06.2015
  • Օ, ՕՊ-ի անունը Վուչիչ Ասենա է: Խնդրում եմ կետադրություն. 23.06.2015

Պատասխանները:


1

Լավ, եկեք նայենք միայն տեսակներին (դա նման է գլուխկոտրուկի. տեսակները պետք է համապատասխանեն).

f1 :: Int -> Int
f2 :: (a -> b) -> [a] -> [b] = (a -> b) -> ([a] -> [b])

երկուսի տիրույթը կազմելու համար անհրաժեշտ է, որ համադոմենը լինի նույնը, ինչ մյուս տիրույթը:

Դա պայմանավորված է նրանով, որ կազմը ունի հետևյալ տեսակը.

(.) :: (b -> c) -> (a -> b) -> a -> c

Տես b-ը պետք է տեղավորվի ;)

Այսպիսով, ձեր f1-ի և f2-ի համար ձեզ հարկավոր կլինի կամ Int ~ (a -> b) կամ Int ~ ([a] -> [b]), որոնք երկուսն էլ լավ չեն աշխատում (ինչպես պարզեցիք):

ԲԱՅՑ դուք կարող եք դիմել f1 f2-ին, քանի որ f1-ը համապատասխանում է f2 առաջին արգումենտին (ինչպես դուք նույնպես տեսաք), այնպես որ ես մի փոքր շփոթված եմ, թե ինչու եք նույնիսկ ցանկանում եք այստեղ օգտագործել կոմպոզիցիան:

դիտողություններ

Ձեր գործառույթները մի փոքր տարօրինակ են, - կարծում եմ, որ դրանք գրելու սովորական ձևը կլինի

f1 x = 2 ^ x
f2 = map

կամ նույնիսկ

fkomp :: [Int] -> [Int]
fkomp = map (2^)

Նկատի ունեցեք, որ վերջինը ոչ ֆունկցիա-կազմվածք է, այլ (ինչպես ձեր դեպքում) ֆունկցիայի հավելված. տեսակները GHCi-ում դուք կտեսնեք ավելի ընդհանուր տարբերակներ, բայց ես կարծում եմ, որ սա մի փոքր ավելի պարզ է)

23.06.2015
  • Կներեք, որ մոռացել էի, նշել եմ :) Շատ շնորհակալություն Carsten! 13.07.2015
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..