2014-11-18 3 views
1

Как я могу сделать это случитьсяПростейшие VARIADIC Функция

assert toList 1 2 3 == [1, 2, 3] 

Я смотрел на

https://www.haskell.org/haskellwiki/Varargs

http://chris-taylor.github.io/blog/2013/03/01/how-haskell-printf-works/

http://gotoanswer.stanford.edu/how_to_write_a_haskell_function_that_takes_a_variadic_function_as_an_argument-9197054/

http://paczesiowa.blogspot.de/2010/03/polyvariadic-primefib-problem.html

Но я не ухватить его еще (еще много младший с Haskell)

Моя попытка до сих пор

{-# LANGUAGE FlexibleInstances #-} 
{-# LANGUAGE UndecidableInstances #-} 
{-# LANGUAGE OverlappingInstances #-} 

class ToVector r where 
    process :: Int -> r 

instance ToVector Int where 
    process = id 

instance ToVector r => ToVector (Int -> r) where 
    process s = \v -> process v 

был встречен с этим

*Main> process 1 2 3 

<interactive>:158:1: 
Could not deduce (ToVector (a0 -> a1 -> t)) 
    arising from the ambiguity check for ‘it’ 
from the context (ToVector (a -> a2 -> t), Num a2, Num a) 
    bound by the inferred type for ‘it’: 
      (ToVector (a -> a2 -> t), Num a2, Num a) => t 
    at <interactive>:158:1-13 
The type variables ‘a0’, ‘a1’ are ambiguous 
When checking that ‘it’ 
    has the inferred type ‘forall a a1 t. 
         (ToVector (a -> a1 -> t), Num a1, Num a) => 
         t’ 
Probable cause: the inferred type is ambiguous 
*Main> 

Любая помощь и нагрузок объяснение очень приветствуется

+2

Ошибка относится к коду вне вашего фрагмента. Вам нужно будет добавить больше для нас, чтобы помочь вам. – crockeea

+1

Действительно нет. У меня просто есть несколько Pragmas в начале кода, но это действительно так. Очевидно, я загружаю модуль через: l mymod.hs в ghci – robkuz

+1

Эта конкретная ошибка, похоже, является ошибкой полиморфизма; Просто попробуйте процесс (1 :: Int) (2 :: Int) (3 :: Int) и посмотрите, как это происходит (средство проверки типов не может само доказать, что 1,2 или 3 должны быть 'Int'), также , если вы новичок в haskell, держите свои руки в таком состоянии. Я использую haskell в течение нескольких лет и никогда не нуждался в чем-то подобном. – Cubic

ответ

1

Пример here демонстрирует, как использовать ваш код. Проблема (правильно идентифицированная @Cubic) - это полиморфизм. В частности, вы можете видеть в примере кода вызывает метод с типом:

main :: IO() 
main = do printAll 5 "Mary" "had" "a" "little" "lamb" 4.2 
      printAll 4 3 5 

Вы должны сделать то же самое:

foo :: Int 
foo = process (1 :: Int) (2 :: Int) (3 :: Int) 

Это указывает тип process, а именно Int -> Int -> Int -> Int , Вам также необходимо указать тип чисел (в отличие от приведенного выше примера), потому что вы сделали только экземпляр для Int s, а 1 - любой тип Num.

+0

Хмм все еще не работает. 'process 1 :: Int' будет работать, но' process 1 :: Int 2 :: Int' не будет работать, и ни 'process (1 :: Int) (2 :: Int)' – robkuz

+2

Вам необходимо аннотировать как входные, так и выходные данные типы в этой ситуации; обратите внимание, что Eric предоставил подпись для 'foo', а также для всех чисел. В однострочном пространстве вам нужно иметь '(process (1 :: Int) (2 :: Int)) :: Int'. (Крайние скобки не нужны, я просто хотел проиллюстрировать низкий приоритет '::'.) –

+0

эй спасибо. это сработало! однако ;-) Очевидно, я хотел бы иметь это без всяких дополнительных намеков типа. – robkuz

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