Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Scott Wlaschin Thinkof数字示例_Haskell - Fatal编程技术网

Haskell Scott Wlaschin Thinkof数字示例

Haskell Scott Wlaschin Thinkof数字示例,haskell,Haskell,我正试图在haskell的函数式编程中找到自己的方法。 我看了Scott Wlaschin的这段精彩视频。 我试图用haskell实现他的ThinkOfNumber示例 我找到的唯一解决方案是: thinkOfANumber numberYouThoughtOf = (\x -> x - numberYouThoughtOf) . (\x -> x / numberYouThoughtOf)

我正试图在haskell的函数式编程中找到自己的方法。 我看了Scott Wlaschin的这段精彩视频。 我试图用haskell实现他的ThinkOfNumber示例

我找到的唯一解决方案是:

thinkOfANumber  numberYouThoughtOf =  (\x -> x - numberYouThoughtOf) 
                                      . (\x -> x / numberYouThoughtOf) 
                                      . (\x -> x - 1) 
                                      . (\x -> x * x) 
                                      . (\x -> x + 1)
因此,我必须以这种方式调用函数,使用2个参数

thinkOfANumber 13 13
为了记住呼叫链中的号码Outhoughtof

我找到了一种简化代码的方法,使用类似管道的操作符,例如F#中的“|>”操作符

也许我确实错过了什么:) 当做 伊万

在nice Fyodor Soikin回复后编辑:

如果有人对Scott Wlaschin演示感兴趣,下面是toRomanNumerals示例的haskell解决方案:

import Data.List.Utils

  infixl 5 |>
  x |> f = f x

  toRomanNumerals number = 
      let replicate_I     = ['I' | _ <- [1 .. number]]
          replace_IIIII_V = replace "IIIII" "V"
          replace_VV_X    = replace "VV" "X"
          replace_XXXXX_L = replace "XXXXX" "L"
          replace_LL_C    = replace "LL" "C"
          replace_CCCCC_D = replace "CCCCC" "D"
          replace_DD_M    = replace "DD" "M"
      in replicate_I
         |> replace_IIIII_V
         |> replace_VV_X
         |> replace_XXXXX_L
         |> replace_LL_C
         |> replace_CCCCC_D 
         |> replace_DD_M
import Data.List.Utils
infixl 5 |>
x |>f=fx
圆环数编号=
让我们复制_I=['I'|替换_uiiii_V
|>更换_VV_X
|>更换XXXXX
|>更换
|>更换“CCCCC”
|>替换\u DD\M
再次感谢fyodor soikin!

来自
数据。功能与F#管完全相似:

当然,如果您喜欢管道(我个人喜欢),您可以在Haskell中定义它:

infixl 5 |>
x |> f = f x

thinkOfANumber numberYonThoughOf = 
    let addOne x = x + 1
        squareIt x = x * x
        subtractOne x = x - 1
        divideByTheNumberYouThoughtOf x = x / numberYonThoughOf
    in  numberYonThoughOf 
        |> addOne
        |> squareIt
        |> subtractOne
        |> divideByTheNumberYouThoughtOf
数据中。函数
是F#管的精确模拟:

当然,如果您喜欢管道(我个人喜欢),您可以在Haskell中定义它:

infixl 5 |>
x |> f = f x

thinkOfANumber numberYonThoughOf = 
    let addOne x = x + 1
        squareIt x = x * x
        subtractOne x = x - 1
        divideByTheNumberYouThoughtOf x = x / numberYonThoughOf
    in  numberYonThoughOf 
        |> addOne
        |> squareIt
        |> subtractOne
        |> divideByTheNumberYouThoughtOf

Fyodor Soikin认为
&
对应于F#的
>
,这是正确的,但阅读Haskell代码给我的印象是,使用
$
运算符并从右到左进行组合被认为更为惯用,就像在数学中一样:

thinkOfANumber numberYouThoughOf = 
  let addOne x = x + 1
      squareIt x = x * x
      subtractOne x = x - 1
      divideByTheNumberYouThoughtOf x = x / numberYouThoughOf
  in divideByTheNumberYouThoughtOf $ subtractOne $ squareIt $ addOne numberYouThoughOf

Fyodor Soikin认为
&
对应于F#的
>
,这是正确的,但阅读Haskell代码给我的印象是,使用
$
运算符并从右到左进行组合被认为更为惯用,就像在数学中一样:

thinkOfANumber numberYouThoughOf = 
  let addOne x = x + 1
      squareIt x = x * x
      subtractOne x = x - 1
      divideByTheNumberYouThoughtOf x = x / numberYouThoughOf
  in divideByTheNumberYouThoughtOf $ subtractOne $ squareIt $ addOne numberYouThoughOf

我的意思是,你可以把整件事写在一行中
想想nx=(a*a-1)/n-n其中a=x+1
我认为这更适合F#pipe操作符,在
控件中可以使用。Arrow
模块。您也可以尝试使用。@bradrn
>
控件中的
操作符。Arrow
实际上是合成,而F#pipe是反向应用。感谢您澄清@Fyodor Soikin-我不太熟悉F#。在这种情况下,
(&)
确实是正确的选择,正如你在下面所说的。我的意思是,你可以把整个事情写在一行中
想想nx=(a*a-1)/n-n其中a=x+1
我认为这更适合F#pipe操作符,在
控件中可以使用。Arrow
模块。您也可以尝试使用。@bradrn
>
控件中的
操作符。Arrow
实际上是合成,而F#pipe是反向应用。感谢您澄清@Fyodor Soikin-我对F#不太熟悉。在这种情况下,
(&)
确实是正确的选择,正如您在下面所说的。谢谢。非常好。谢谢。非常好。