2016-07-24 3 views
1

Я начинаю изучать Haskell и должен создать действительно простую функцию, которая принимает два списка и объединяет их.Ошибка совпадения типа Haskell при передаче двух списков

app :: [a] -> [a] -> [a] 
app xs ys = xs ++ ys 

Это часть задачи, в которой мы должны сравнивать меньшие функции, подобные этим.
Я делаю это с Критерием. Полный код выглядит следующим образом:

import Criterion.Main 
main = defaultMain [ 
    bgroup "normal 100" [ bench "app"  $ whnf app $ [0..49] [50..100] 
         ] 
        ] 
app :: [a] -> [a] -> [a] 
app xs ys = xs ++ ys 

компилирование терпит неудачу, и оставляет меня с этим:

Couldn't match expected type `[Integer] -> [a0]' 
      with actual type `[Integer]' 
The function `[0 .. 49]' is applied to one argument, 
but its type `[Integer]' has none 
In the second argument of `($)', namely `[0 .. 49] [50 .. 100]' 
In the second argument of `($)', namely 
    `whnf app $ [0 .. 49] [50 .. 100]' 

У меня есть реальная проблема для дешифрования сообщения об ошибках GHC, и я в основном застрял здесь.
Я знаю, что здесь есть много вопросов о несоответствиях типов, но я не мог найти решение.
Заранее благодарим!

+0

Я бы порекомендовал переписать это без использования '$' в любом месте, только используя скобки, а затем добавив '$' обратно после того, как вы заработаете, если захотите. –

+0

@AlexisKing Да, я пробовал это уже, но у меня такая же ошибка, поэтому я их оставил. – DShade

ответ

3

Подписи bench и whnf являются:

bench :: String  -> Benchmarkable -> Benchmark 
whnf :: (a -> b) -> a -> Benchmarkable 

С app принимает два аргумента, нам нужно, чтобы снискать первый в вызове whnf:

whnf (app [0..49]) [50..100] :: Benchmarkable 

Обратите внимание, что whnf имеет два аргументы: (app [0..49]) и [50..100].

Теперь мы можем сформировать вызов bench:

bench "app" (whnf (app [0..49]) [50..100]) :: Benchmark 

Если мы хотим использовать $, есть только одно место, где мы можем использовать его:

bench "app" $ whnf (app [0..49]) [50..100] 

Мы не можем разместить в размере $ после whnf, потому что в целом:

a b c == (a b) c 

и

a $ b c == a (b c) 
+0

Это имеет смысл. Большое спасибо! – DShade

Смежные вопросы