2013-09-29 80 views
3

例如,假設我有一個[是int BOOL],我想將它轉化成一個HList ....所以可以將Haskell中的「Either」列表轉換爲「HList」嗎?

[Left 1, Right False, Left 2] 

將成爲

1 .*. False .*. 2 .*. HNil 

(其實我覺得這是不可能的,但是很想聽到別的......甚至爲這樣的函數寫類型似乎也是不可能的,儘管也許有一種方法可以做到這一點,而不僅僅是寫一個函數)。

回答

1

您不能轉換[Either Int Bool]到HList,因爲它是一個動態值,而是一個HList具有取決於其值的靜態類型。考慮以下幾點:

  • 1 .*. False .*. 2 .*. HNil具有類型HCons 1 (HCons False (HCons 2 HNil))
  • 1 .*. HNil有類型HCons 1 HNil

兩個的這些值是你應該轉換功能的可能的結果,但他們有不同的類型。

上面的一切都是因爲什麼重視HList也必須是可用的編譯器,以找出它的類型的信息。在你的情況下,你只能在運行時獲得這個值,即當程序已經被編譯時。

+0

我懷疑很多....這難道不是編譯時間的限制意味着HLists是幾乎元組(加上一個公認有用的附加功能)? – jamshidh

+0

是的,通過該屬性他們非常相似。事實上,使用最原始的方法,你的HList可以被編碼爲'(1,(False,(2,()))'。然而,HList的威力在類型級(編譯時)編程中,其應用的實際領域是非常有限的,似乎大於實際學業。學習型家庭可能有很大的幫助理解HLists的目的。 –

1

參見該怎麼辦擴展變種HList this post by Oleg

+0

我閱讀後,發現它很有趣,儘管它不處理我的問題....它是一個HList的描述(它們是自制的,而不是使用Data.HList,但它是一樣的想法)。我錯過了什麼?正如Nikita指出的那樣,轉換函數的類型是n甚至連一致,所以這似乎是不可能的。 – jamshidh

+0

Hackage上的HList版本是自制軟件,Oleg's原創:)。這篇文章展示瞭如何在HList方面編碼和類型(又名變種,也就是「Either」等),通過在HList記錄上實現左/右構造函數作爲選擇函數來表示要應用於「要麼「。它不*轉換*,因此,不。 – barsoap

相關問題